首页 新闻 会员 周边 捐助

C# 属性和字段的区别

0
悬赏园豆:5 [已解决问题] 解决于 2021-06-24 15:44
public class Demo
{
        /// <summary>
        /// 第一种方法声明(A)
        /// </summary>
        private string _Name;
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        /// <summary>
        /// 第二种方法声明(B)
        /// </summary>
        public string Name { get; private set; }
}

请问:
1.在C#中这两种声明方式有什么区别吗?
2.目前所知应该是从.net framework升级之后产生的变化;
3.如果有所却别,在什么场景下独立使用呢?

Micro丶Organism的主页 Micro丶Organism | 菜鸟二级 | 园豆:205
提问于:2021-06-22 09:16
< >
分享
最佳答案
1

1.在C#中这两种声明方式有什么区别吗?
没有区别, 仅仅语法区别而已.
2.目前所知应该是从.net framework升级之后产生的变化;
该特性详细解释请参考官方文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history#c-version-60
https://docs.microsoft.com/zh-cn/dotnet/csharp/properties
3.如果有所却别,在什么场景下独立使用呢?
参考文档说明.

收获园豆:3
czd890 | 专家六级 |园豆:14488 | 2021-06-22 10:59

能够通俗的说一下这两者在什么情况下使用呢,我看官方文档也没说什么情况下必须要用哪个呢

Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-23 16:35

@Micro丶Organism: { get; private set; }语法糖, 可以理解为是为了编码简单来的简写. 某些情况不适用, 例如:

private int _Name;
public int Name
{
    get { return _Name; }
    set { _Name = value; }
}
void myMethod(){
    System.Threading.Interlocked.Increment(ref this._Name);
}

要对变量进行ref, out之类的操作的时候属性就不支持了.

属性声明的一些变化和支持的语法:

int age;
int Age{get{return this.age;} set{this.age=value;}} //最开始的样子

int Age{get;set;} // 为了书写简单升级了.

int Age{internal get; private set;} // 可以为get或者set声明适用范围, 本例子程序集内可以get, 类内部可以set.

int Age{get; init set;} //C#9新语法, 只能在new类的时候set, 包含构造函数(new myClass(18)),以及初始化模式(new myClass(){Age=18})
czd890 | 园豆:14488 (专家六级) | 2021-06-24 11:16

@czd890: 清楚明白,多谢多谢

Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-24 15:39
其他回答(4)
1
收获园豆:1
兴想事成 | 园豆:540 (小虾三级) | 2021-06-22 09:24

我能知道属性和字段的区别,目前不了解的是,上面两种声明属性的方式有什么区别呢,难道只是我提问中第2条(.NET3.0及其后续版本)自动属性的区别吗

支持(0) 反对(0) Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-22 09:35

@Micro丶Organism: 具体底层的不同, 可以看IL代码 ,我暂时没设计到.net core 上的研究, 你可以通过IL 看一下 底层源代码.

支持(0) 反对(0) 兴想事成 | 园豆:540 (小虾三级) | 2021-06-22 09:37
0

最初,属性就是get和set方法的简写,为了方便编码。但是,微软专门正对属性做了一些工作,比如,UI绑定,依赖属性等

收获园豆:1
会长 | 园豆:12463 (专家六级) | 2021-06-22 12:13

貌似你说的那个UI绑定和依赖属性主要是针对WPF的吧

支持(0) 反对(0) Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-23 16:23

@Micro丶Organism: 是的,依赖属性是WPF开始有的。数据绑定从winform就有了

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2021-06-23 19:00

@Micro丶Organism: 你写过java吗?;里面的实体有很多get和set方法,C#的属性就是get和set方法,方法和字段当然是不一样的,方法里可以写逻辑:如:

public int Age
{
    set 
    {
        if(value < 0 || value > 200)
        {
              throw new Exception("滚");
        }
    }
}
支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2021-06-23 19:02

至于你列出来的那两种属性的不同写法,那是历史问题,和C#的版本有关,新版本中增加了新的写法而已,至于用哪一种写法,取决于你的需求。

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2021-06-23 19:05

@会长: 感谢回复,字段和属性的区别我是理解的,只是没明白上述两种属性声明的区别,再次感谢

支持(0) 反对(0) Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-24 15:42
0

你这两种不都是属性?

顾晓北 | 园豆:10898 (专家六级) | 2021-06-22 15:28

还是有所区别的,可进一步参考楼上回复,感谢回复

支持(0) 反对(0) Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-24 15:43

@Micro丶Organism: 你文不对题啊,你问的是属性和字段的区别,结果代码里面两个都是属性,只不过写法不同,权限不同,但本质还是属性啊。。。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2021-06-24 16:46
0

其实没必要纠结有啥区别,区别就在于可能是新老版本之间的语法差异。

龙行天涯 | 园豆:1794 (小虾三级) | 2021-06-24 11:10

是的,大部分情况下是没有太大区别的,感谢回复

支持(0) 反对(0) Micro丶Organism | 园豆:205 (菜鸟二级) | 2021-06-24 15:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册