请问在封装类的私有成员时用自动属性{get;set;},可是怎么知道这个属性是对应哪个私有成员的呢?

hipparch 2016-04-21 05:35:27
比如说
{
private string aBC=" ";
public string Abc
{
get {return aBC;}
set {aBC=value}
}
}
可以直接简略为
{
public string Abc {get;set;}
}

但是我怎么知道这个Abc的属性对应的是私有成员aBC呢??
还有这个属性也太无聊了吧 去掉后面的{get;set;}等于又是定义了一个公共成员。。。
...全文
285 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2016-04-28
  • 打赏
  • 举报
回复
引用 10 楼 hipparch 的回复:
[quote=引用 6 楼 guonan198811 的回复:] 我觉得楼主理解错了;上面两种其实是不一样的 下面的一种其实跟aBC就没有关系了,外部可以直接访问Abc属性,这时候不存在aBC了。 而第一种情况一般还有一行代码在构造函数中。this.Abc =aBC;这样是为了通过字段就可以访问Abc属性,而私有字段一般是在类初始化的时候就可以赋值的。如果没有这个字段那么你只能在类外部通过手动赋值来确定Abc属性的值。
嗯 我试过了 第二种办法,属性和原来对应的那个私有成员已经毫无关系了,外部可以直接访问这个属性。 我只是很奇怪,没有了私有成员的属性还叫属性吗,和公共成员已经没有什么区别了。 我在看精通C#这本书,里面说如果用这种方法定义了一个属性,会自动生成一个私有后备字段,这个私有后备字段在C#代码库中是看不到的,只能用ildasm看。原文如此,那岂不是和本来要封装的那个私有成员毫无关系了??我百思不得其解,还是在其他什么地方有用?[/quote] get和set是方法,可以写代码处理相应逻辑。公有变量没有这个功能,需要手动添加XXXGet XXXSet方法。 这么说吧,好处就是省得你多敲几下键盘,以后阅读起来爽一点。 机器能做的事情就不需要让人做。
stalkerru 2016-04-22
  • 打赏
  • 举报
回复
引用 7 楼 yuwenge 的回复:
[quote=引用 2 楼 hipparch 的回复:] 我的意思是编译器怎么会知道 Abc {get;set;}对应的是私有成员aBC呢? 前面写完整了是明白的,不写完整怎么知道呢? 难道属性可以独立使用?没有成员的属性那还有什么意义呢
编译器的智商比你稍微高那么一点点,所以他看到这句话的时候会自动定义一个隐藏的成员变量 (_abc 或者其他什么名字吧)来存储属性。 至于你把后面的括号删掉,他就知道你想定义一个成员变量在这。 发现问题是好的,但还是先想想如果是你,你准备怎么解决这个问题。[/quote] 跟楼主的问题一样 你说过的话你自己试过吗?谁告诉你{get;set}之后系统会自动生成aBC?
xuzuning 2016-04-22
  • 打赏
  • 举报
回复
谁跟你说 编译器怎么会知道 Abc {get;set;}对应的是私有成员aBC的? 你不能动动手吗 private string aBC="123"; 然后你检查 Abc 的值
卧_槽 2016-04-22
  • 打赏
  • 举报
回复
引用 2 楼 hipparch 的回复:
我的意思是编译器怎么会知道 Abc {get;set;}对应的是私有成员aBC呢? 前面写完整了是明白的,不写完整怎么知道呢? 难道属性可以独立使用?没有成员的属性那还有什么意义呢
编译器的智商比你稍微高那么一点点,所以他看到这句话的时候会自动定义一个隐藏的成员变量 (_abc 或者其他什么名字吧)来存储属性。 至于你把后面的括号删掉,他就知道你想定义一个成员变量在这。 发现问题是好的,但还是先想想如果是你,你准备怎么解决这个问题。
  • 打赏
  • 举报
回复
这种写法是语法糖,主要就是用于简单的get;set属性,如果你需要对属性的get或set做一定的封装处理,那就不能简单的{get;set;},而是要用你原来的写法
  • 打赏
  • 举报
回复
{get;set;}这样是由frame给你生成对应的field字段
Poopaye 2016-04-22
  • 打赏
  • 举报
回复
1、c#鼓励使用属性,比如有个叫PropertyGrid的东西 2、可以快速实现只读和只写的属性 public int MyProp { get; private set; } public int MyProp { private get; set; }
hipparch 2016-04-22
  • 打赏
  • 举报
回复
引用 6 楼 guonan198811 的回复:
我觉得楼主理解错了;上面两种其实是不一样的 下面的一种其实跟aBC就没有关系了,外部可以直接访问Abc属性,这时候不存在aBC了。 而第一种情况一般还有一行代码在构造函数中。this.Abc =aBC;这样是为了通过字段就可以访问Abc属性,而私有字段一般是在类初始化的时候就可以赋值的。如果没有这个字段那么你只能在类外部通过手动赋值来确定Abc属性的值。
嗯 我试过了 第二种办法,属性和原来对应的那个私有成员已经毫无关系了,外部可以直接访问这个属性。 我只是很奇怪,没有了私有成员的属性还叫属性吗,和公共成员已经没有什么区别了。 我在看精通C#这本书,里面说如果用这种方法定义了一个属性,会自动生成一个私有后备字段,这个私有后备字段在C#代码库中是看不到的,只能用ildasm看。原文如此,那岂不是和本来要封装的那个私有成员毫无关系了??我百思不得其解,还是在其他什么地方有用?
南天空 2016-04-21
  • 打赏
  • 举报
回复
我觉得楼主理解错了;上面两种其实是不一样的 下面的一种其实跟aBC就没有关系了,外部可以直接访问Abc属性,这时候不存在aBC了。 而第一种情况一般还有一行代码在构造函数中。this.Abc =aBC;这样是为了通过字段就可以访问Abc属性,而私有字段一般是在类初始化的时候就可以赋值的。如果没有这个字段那么你只能在类外部通过手动赋值来确定Abc属性的值。
  • 打赏
  • 举报
回复
有的时候,你太任性,就容易想得太多(而不是太少)。这个时候就要自己测试自己验证,不要过早下结论。
  • 打赏
  • 举报
回复
引用 2 楼 hipparch 的回复:
我的意思是编译器怎么会知道 Abc {get;set;}对应的是私有成员aBC呢? 前面写完整了是明白的,不写完整怎么知道呢? 难道属性可以独立使用?没有成员的属性那还有什么意义呢
谁跟你说编译器会使用 aBC 字段?你从哪里听说的?梦里?
江南小鱼 2016-04-21
  • 打赏
  • 举报
回复

//2.0
private string _sb;
public string SB
{
get { return _sb;}
set { _sb = value;}
}

//2.0以上版本(编译器会开辟一会内存空间指向SB的,这种写法是一种语法糖)
public string SB
{
get;set;
}
hipparch 2016-04-21
  • 打赏
  • 举报
回复
我的意思是编译器怎么会知道 Abc {get;set;}对应的是私有成员aBC呢? 前面写完整了是明白的,不写完整怎么知道呢? 难道属性可以独立使用?没有成员的属性那还有什么意义呢
tcmakebest 2016-04-21
  • 打赏
  • 举报
回复
属性和成员是不同的,楼主需要什么样的就用什么样的, get;set; 是为了省事,不行就不用.

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧