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.如果有所却别,在什么场景下独立使用呢?
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.如果有所却别,在什么场景下独立使用呢?
参考文档说明.
能够通俗的说一下这两者在什么情况下使用呢,我看官方文档也没说什么情况下必须要用哪个呢
@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: 清楚明白,多谢多谢
我能知道属性和字段的区别,目前不了解的是,上面两种声明属性的方式有什么区别呢,难道只是我提问中第2条(.NET3.0及其后续版本)自动属性的区别吗
@Micro丶Organism: 具体底层的不同, 可以看IL代码 ,我暂时没设计到.net core 上的研究, 你可以通过IL 看一下 底层源代码.
最初,属性就是get和set方法的简写,为了方便编码。但是,微软专门正对属性做了一些工作,比如,UI绑定,依赖属性等
貌似你说的那个UI绑定和依赖属性主要是针对WPF的吧
@Micro丶Organism: 是的,依赖属性是WPF开始有的。数据绑定从winform就有了
@Micro丶Organism: 你写过java吗?;里面的实体有很多get和set方法,C#的属性就是get和set方法,方法和字段当然是不一样的,方法里可以写逻辑:如:
public int Age
{
set
{
if(value < 0 || value > 200)
{
throw new Exception("滚");
}
}
}
至于你列出来的那两种属性的不同写法,那是历史问题,和C#的版本有关,新版本中增加了新的写法而已,至于用哪一种写法,取决于你的需求。
@会长: 感谢回复,字段和属性的区别我是理解的,只是没明白上述两种属性声明的区别,再次感谢
你这两种不都是属性?
还是有所区别的,可进一步参考楼上回复,感谢回复
@Micro丶Organism: 你文不对题啊,你问的是属性和字段的区别,结果代码里面两个都是属性,只不过写法不同,权限不同,但本质还是属性啊。。。
其实没必要纠结有啥区别,区别就在于可能是新老版本之间的语法差异。
是的,大部分情况下是没有太大区别的,感谢回复
https://www.cnblogs.com/green-jcx/p/9023141.html 参考这篇文章
– 兴想事成 3年前