请教c#/vb.net高手{ get; set; }属性的写法问题。

想上面这中写法我相信哪里都可以见到,也就是一个属性名,没有对get或者是set做任何限制。我的问题就是这样的属性声明有实际意义吗?它有没有把属性与成员变量对应起来?据我所... 想上面这中写法我相信哪里都可以见到,也就是一个属性名,没有对get或者是set做任何限制。我的问题就是这样的属性声明有实际意义吗?它有没有把属性与成员变量对应起来?据我所知要对应至少应该写一个return 或者 =value之类的。那这样空的get set的意义何在? 展开
 我来答
帐号已注销
推荐于2016-11-26 · TA获得超过260个赞
知道小有建树答主
回答量:85
采纳率:0%
帮助的人:62.8万
展开全部
这种写法在.net 2.0后才出现的,目的是为了减轻程序员的工作量,编译器会自动为你补充完整,如:
public string name{get;set;}
编译器自动生成(可能会更负责更完善):

private string name;
public string Name
{
get { return name; }
set { name= value; }
}

这种写法在一般时候很好,但是有一种情况你不得不放弃这种写法,那就是你要在里面进行校验的时候,比如set中有运算或者校验之类的,get中有转换等等,这种情况下,你就必须老老实实的写个完整的才可以。
更多追问追答
追问
假如成员变量有a,b两个,属性名是Name,编译器如何知道我想对应a,还是b?
追答
明白你的困惑在哪里了,使用这种简洁的写法时,你不用去单独声明a和b,只需要写:
public string a{get;set;}
public string b{get;set;}

编译器会主动为你生成:
private string a;
public string A
{
get { return a; }
set { name= a; }
}

private string b;
public string B
{
get { return b; }
set { name= b; }
}

不知道你能明白?
给你补充一下:
你可能在想,你声明了两个变量a,b,然后又写了一个public string Name{get;set;}
你困惑的是这个Name到底指的是a还是b,是吧?
如果你这么写的话,你这个类中就存在三个变量了,a,b和name,你能明白了吗?
shelher
2013-05-08 · TA获得超过6134个赞
知道大有可为答主
回答量:3609
采纳率:100%
帮助的人:6265万
展开全部
先回答你的疑问
假如成员变量有a,b两个,属性名是Name,编译器如何知道我想对应a,还是b?
编译器是不可能把Name对应到a或者b这两个的任何一个
如果你想让编译器对应a
那么你的代码应该是
Public string A{get;set;}
b是一样的道理

至于为什么要写成{get;set;} 是因为这样写开发速度显然要比加上return要高
而且这样写与加上return那样写达到的效果是一样的

如果你对达到的效果一样有疑问的话你可以用反编译器查看这两种生成的代码
使用第一种
private string name;
public string Name
{
get { return name; }
set { name= value; }
}
与使用第二种
public string Name{get;set ;}

最后编译器都生成一种代码就是:
private string _name;
public string Name
{
get { return _name; }
set { _name= value; }
}

如有疑问请追问
更多追问追答
追问
那么问题的关键就是,对于这种只有首字母大小写不同的成员变量与属性的对应,微软msdn有没有正式的说明?
追答
MSDN上的介绍是说
在 C# 3.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。客户端代码还可通过这些属性创建对象。如下面的示例所示声明属性时,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。

自动属性就是{get;set;}这样的简洁写法
上面说到 编译器将创建一个私有的匿名支持字段 (可以理解为编译器创建的这个私有字段一定是你声明的字段的小写并且前面加下划线)
例如Name 对应的应该为_name
如果你不相信的话 你可以使用反编译器自己去看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
秦爱传c5
2013-05-08 · TA获得超过2052个赞
知道小有建树答主
回答量:635
采纳率:50%
帮助的人:318万
展开全部
class Class1
{
    public string Arg{get;set;}
}

这种写法是简写形式,当用编译器编译时,编译器会自动补足所需代码:

class Class1
{
    private string _Arg;//这个变量是由编译器随机生成的,不一定是_Arg这个名字
    public string Arg{get{return _Arg;}set{_Arg=value;}}
}
更多追问追答
追问
你的意思是必须由编译器自动产生才行?而不是编译器根据首字母大小写的唯一差别来判定?
追答

不是要编译器自动产生才行,是当你使用简写时,编译器就会自动补足。

一般情况下,我们创建属性会这样写:

class Class1
{
    private int arg;
    public int Arg{get{return arg;}set{arg=value;}}
}

但有些人为了省工作量,不对属性作访问修饰时,就可以使用简写形式

class Class1
{
    public int Arg{get;set;}
}

当我们需要对属性作访问修饰时,就要写全面的代码了,譬如上面例子,假如Arg为非负整数,我们就需要在set访问器或get访问器中进行过滤,保证Arg为非负整数

class Class1
{
    private int arg;
    public int Arg
    {
        get{return arg;}
        set{arg = value >= 0 ? value : 0;}
    }
}

此时不能使用简写形式

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-05-08
展开全部
这个是自动属性,简化属性写法,编译器会为你补足具体的代码。
public string Name{get;set;}
等价于
private string name;
public string Name{get{return name;}set{name=value;}}
更多追问追答
追问
编译器怎么知道属性对应哪个成员变量?
追答
自动属性是C#3.0的新特性,你不需要知道对应哪个成员变量,因为你调用时只是使用Name这个属性。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友edc2e318b
2013-05-08 · 超过10用户采纳过TA的回答
知道答主
回答量:22
采纳率:0%
帮助的人:28.5万
展开全部
你的想法是正确的,但是没人说一个get,一个set就是完整的写法了啊。。。它被省略了而已,举个例子
class xxxx
{
private int a;
public int _a
{
get { return a; }
set { a = value; }
}
}
明白?
更多追问追答
追问
我的意思是看到过大量的,而且明显是老手写的代码,只有get;set;的,如何解释?
追答
比如我上面写的函数,写get和set就够了,它的值就已经置好了。写那么多又不会加工资。。。这个老手还是新手压根一点关系都没有。再举个例子,你应该知道默认构造函数这个东西,难不成我新增一个类都需要去写一个默认的构造函数么,又不是必要的东西。而且,析构函数你压根都没写,那你类调用完了之后难不成还不能退出了啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式