首页 新闻 会员 周边

.net get,set访问器的区别?

0
悬赏园豆:5 [已解决问题] 解决于 2012-12-25 11:42

请问:

private TestClass _tc1;

private TestClass TC1

{

  get{return _tc1;}

  private set{_tc1=value;}

}

private TestClass TC1

{

  get;

  private set;

}

有什么区别?为什么我在使用这个属性的时候,用第一种写法没有问题,而第二种却出现”空引用异常“的问题呢?运行平台win7+vs2010(.net3.5),并且同个类中也有其他的属性,都没问题,只有这 一个出问题,我目前能想到的思路就是第二种写法是用编译器自动创建临时储存变量,然后创建失败,这样问题就出在TestClass这个类身上,但是我又查不出有什么问题,希望各位大哥给个提示,是不是我想错方向了。

问题补充:

好吧 ,那些都是语法问题,不是我问题的关键,我只是随便在这里敲的几行。。。源代码如下:

[Serializable]
public sealed class GWord
{
public const int NOT_CACHED = -1;

//private TextDecoration _decoration;
private GWord _next;
internal int nextOffsetCache;
internal int displayLengthCache;

internal TextDecoration Decoration
{
//get { return _decoration; }
//private set { _decoration = value; }
get;
private set;
}

*另外我查看IL文件也没发现这两种写法有任何区别啊。

woocool的主页 woocool | 初学一级 | 园豆:190
提问于:2012-12-21 09:44
< >
分享
最佳答案
0

第二句 实质上生成的代码 就是 第一句。

至于 为什么我在使用这个属性的时候,用第一种写法没有问题,而第二种却出现”空引用异常“的问题呢? 这个是不太可能,建议你把全部代码贴出来。

收获园豆:5
geass.. | 小虾三级 |园豆:1821 | 2012-12-21 17:18
其他回答(12)
0

请问提示“空引用异常”的代码是什么样子的?

Launcher | 园豆:45045 (高人七级) | 2012-12-21 09:48
0

我试了下,win7+2010(4.0),按你的代码编译,提示"错误 “ConsoleApplication2.Program.TC1.set”访问器的可访问性修饰符必须比属性或索引器“ConsoleApplication2.Program.TC1”具有更强的限制",也就是说你这内部的private是不需要用的。

happydaily | 园豆:301 (菜鸟二级) | 2012-12-21 09:59
0

两个私有? 外面的私有 就全私有了。

public TestClass TC1

{

  get;

  private set;

}

Qlin | 园豆:2403 (老鸟四级) | 2012-12-21 10:06
0

我怎么觉得你的代码连编译应该都不会通过呢

RyanCheng | 园豆:474 (菜鸟二级) | 2012-12-21 10:06
0

第2中写法,你在外部是不能TC1 进行赋值的,你的TC1一直都是null,除非你在这个类的内部给TC1赋值,

那么取TC1的值时,基本上都是null,就是空引用的错误

chenping2008 | 园豆:9836 (大侠五级) | 2012-12-21 10:17
0

用来设置和获取属性值。

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-12-21 11:12
0

都是一样的,2.0以上版本都可以直接写 get;set;

edsonwu | 园豆:146 (初学一级) | 2012-12-21 14:07
0

 里面最好不能成私有的啊 ,公共成员变量!

miloss | 园豆:254 (菜鸟二级) | 2012-12-21 14:38
0

看不出有什么问题。。

jone_e | 园豆:1410 (小虾三级) | 2012-12-21 15:37
0

简单说:Get是获取值

         Set 写入  如果在Set这里加了Private 那么意思是 只能在当前的类中 写入。

在 水 一 方 | 园豆:1097 (小虾三级) | 2012-12-21 16:02
0

private TestClass _tc1;

private TestClass TC1

{

  get{return _tc1;}

  private set{_tc1=value;}

}这是.netframework3.5以前的写法,现在的写法是public TestClass tc{get;set;}

程序新青年 | 园豆:841 (小虾三级) | 2012-12-24 16:29

你好,关于3.5之后,get set 的写法,如果我原来是

private UserType userType ;

public UserType UserType { get{ return=userType ;} set{userType =value;} }

public bool IsAdministrator
{
get { return userType == UserType.Administrator ? true : false; }
}

这种在3.5之后要怎么写呢

支持(0) 反对(0) 落叶菜鸟 | 园豆:192 (初学一级) | 2016-06-06 16:40

@落叶菜鸟: 

public UserType UserType { get;set;}

public bool IsAdministrator
{
get { return userType == UserType.Administrator ? true : false; }
}

支持(0) 反对(0) 程序新青年 | 园豆:841 (小虾三级) | 2016-06-06 17:07

@程序新青年: userType 会提示不存在,还有如何给初始值呢

支持(0) 反对(0) 落叶菜鸟 | 园豆:192 (初学一级) | 2016-06-06 17:08

@落叶菜鸟: 可以在构造函数里赋值啊

支持(0) 反对(0) 程序新青年 | 园豆:841 (小虾三级) | 2016-06-06 17:10

@程序新青年: 知道了,那么第一个问题,

public UserType UserType { get;set;}

public bool IsAdministrator
{
get { return userType == UserType.Administrator ? true : false; }
}

我写了这一句,userType 提示不存在

支持(0) 反对(0) 落叶菜鸟 | 园豆:192 (初学一级) | 2016-06-06 17:15

get { return userType == UserType.Administrator ? true : false; }

改成

    get { return this.UserType == UserType.Administrator ? true : false; }

这样写可以吗?

支持(0) 反对(0) 落叶菜鸟 | 园豆:192 (初学一级) | 2016-06-06 17:18
0

是我序列化出了问题。抱歉。因为我之前是用第一种写法生成的数据,然后改动之后用第二种方法进行的反序列化,所以造成临时变量改变,读取数据失败。

woocool | 园豆:190 (初学一级) | 2012-12-25 11:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册