我对C#中的自动属性有点困惑,例如
public string Forename{ get; set; }
Run Code Online (Sandbox Code Playgroud)
我知道你不需要声明私有变量来保存代码,但是当你不使用任何get或set逻辑时,属性的重点是什么?为什么不用
public string Forename;
Run Code Online (Sandbox Code Playgroud)
我不确定这两个语句之间有什么区别,如果你想要额外的get/set逻辑,我一直认为你使用过属性?
我需要将JSON中表示的一些JavaScript对象反序列化为适当的C#类.鉴于自动属性的优点,我宁愿在这些类中使用它们而不是只有字段.不幸的是,.NET序列化引擎(至少在默认情况下)完全忽略反序列化的自动属性,只关心支持字段,这显然不存在于JavaScript对象中.
鉴于没有标准的方法来命名支持字段,说实话,我甚至不想打扰"让我们创建一个看起来像C#支持字段的JavaScript对象"的方法,因为它听起来有点脏,唯一的方法如果我可以强制序列化引擎以某种方式忽略支持字段并直接使用属性,我可以将JavaScript字段序列化为C#auto-properties.不幸的是,我无法弄清楚这是如何完成的,或者是否可以完成.任何想法,将不胜感激.
编辑:这是一个例子:
使用Javascript:
function Cat()
{
this.Name = "Whiskers";
this.Breed = "Tabby";
}
var cat = new Cat();
Run Code Online (Sandbox Code Playgroud)
然后将其序列化为"{Name:'Whiskers'}".
C#类:
[Serializable()]
public class Cat
{
public string Name { get; set; }
public string Breed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而反序列化代码失败了:
new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
Run Code Online (Sandbox Code Playgroud)
从例外情况可以看出它失败了,因为它正在寻找支持领域.
EDIT2:这是例外,如果有帮助(没有内部异常):
System.Runtime.Serialization.SerializationException
"数据合同类型'Test.Cat'无法反序列化,因为
<Name>k__BackingField, <Breed>k__BackingField找不到所需的数据成员' ."
我尝试了以下示例:
public class TestBase
{
public virtual string ReadOnly { get; }
public TestBase()
{
ReadOnly = "from base";
}
}
class Test : TestBase
{
public override string ReadOnly { get; }
public Test()
{
// nothing here
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个Test实例时,我看到ReadOnly保持为null.但为什么?我真的不明白它,有人可以向我解释为什么会这样吗?至少我会期望和错误,只能在拥有类之外设置只读属性.
如果在C#自动属性中必须获取和设置get和set,为什么我必须打扰指定"get; set;" 什么?
我正在使用xCode6 Beta 3,并且遇到一个问题,其中先前编译良好的代码(xCode 5.1.1或xCode6 beta 2)在访问自动合成的实例变量时突然开始给我"使用未声明的标识符"错误:
- (void)setFinished:(BOOL)finished {
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
//ERROR:
Use of undeclared identifier '_finished'; did you mean 'finished'?
Run Code Online (Sandbox Code Playgroud)
添加@synthesize finished = _finished;使错误消失,但有没有办法强制xCode6 Beta 3使用下划线表示法使用自动属性合成?
如何防止二进制格式化程序对自动实现的属性进行序列化?[NonSerialized]属性只能与字段一起使用.使用自动实现的属性时,该字段将被隐藏.
所以在我的情况下,我正在使用反射来发现类的结构.我需要能够通过PropertyInfo对象找出属性是否是自动实现的属性.我假设反射API没有公开这样的功能,因为自动属性是C#依赖的,但是有没有解决方法来获取这些信息?
显然VS 2008不允许在自动属性的setter上设置断点.
即如果我定义这样的自动属性:
public int CurrentFramesize
{
get;
protected set;
}
Run Code Online (Sandbox Code Playgroud)
然后尝试在setter行上设置断点,整个auto-property变为breakpoint-red.
这适用于普通属性,所以任何想法为什么自动属性得到这种特殊(限制性)处理?它们不仅仅是具有隐藏背景场的正常属性的语法糖吗?
debugging breakpoints automatic-properties .net-3.5 visual-studio-2008
我开始知道C#3.0带有Auto-Implemented Properties的新功能,我喜欢它,因为我们不必在此声明额外的私有变量(与之前的属性相比),之前我使用的是属性,即
private bool isPopup = true;
public bool IsPopup
{
get
{
return isPopup;
}
set
{
isPopup = value;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我已将其转换为Auto-Implemented属性即
public bool IsPopup
{
get; set;
}
Run Code Online (Sandbox Code Playgroud)
我想将此属性的默认值设置为true而不使用它甚至在page_init方法中,我尝试但没有成功,任何人都可以解释如何做到这一点?
我有下一个代码:
struct T
{
public T(int u)
{
this.U = 10; //Errors are here
}
public int U { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
C#编译器在规定的行中给出了一对错误:1)在将控制权返回给调用者之前,必须完全分配自动实现的属性"TestConsoleApp.Program.TU"的后备字段.考虑从构造函数初始化程序中调用默认构造函数.2)在分配所有字段之前,不能使用'this'对象
我做错了什么?帮帮我理解
c# ×8
.net ×3
c#-3.0 ×2
.net-3.5 ×1
asp.net ×1
breakpoints ×1
constructor ×1
debugging ×1
ios ×1
json ×1
reflection ×1
xcode6 ×1