![](/img/trans.png)
[英]How do you give a C# Auto-Property a default value using a custom attribute?
[英]c# custom auto-property setter not allowing me to massage the value
您可以在自动属性中执行类似的操作吗?
public byte[] bytearr
{
get { return value; }
set
{
(value.Length %2 == 0 ?
value :
new List<byte>(value).Add((byte)0)
).ToArray();
}
}
注意三元数中“:”的右手。
如果可以,我的语法有什么问题? new List<>
不喜欢尝试添加必要的.ToArray()
。
但是我似乎无法在setter自动属性中使用多个代码执行行。
我不认为我曾经遇到过像这样的二传手想了解字段值的问题。 但是自从我宣布支持领域以来已经有多久了? 我不知道。
我已经尝试了很多东西。 而且,如果我必须声明私有字段也没问题。 在这一点上,我比什么都更好奇,因为似乎可以在不实际声明该字段的情况下做到这一点。
谢谢。
您应该在此处使用私有字段,如下所示。
在我看来,您正在检查传入数组中的项目数是奇数还是偶数。 如果是偶数,则按原样接受数组,但如果很奇怪,则在接受数组之前在数组末尾添加零。
private byte[] byteArray;
public byte[] ByteArray
{
get { return this.byteArray; }
set
{
this.SetByteArray(value);
}
}
private void SetByteArray(byte[] value)
{
if (value.Length % 2 == 0)
{
this.byteArray = value;
}
else
{
var x = new List<byte>(value);
x.Add(0);
this.byteArray = x.ToArray();
}
}
您应该在寻找集合初始值设定项 ,而不是自动属性。
这将使您可以创建列表并内联添加值。
public byte[] bytearr
{
get { return value; }
set
{
somePrivateField = (value.Length %2 == 0 ?
value :
new List<byte> { value, (byte)0 }
).ToArray();
}
}
您不能为属性提供实现,也不能为其声明后备字段,在该字段中存储从setter获取的值。 实际上,在具有自动实现的属性的情况下,编译器会自动为您创建一个私有后备字段。 但是,此字段对外部隐藏,您无法访问它(可以使用反射,但这不是重点)。
因此,您的媒体资源应如下所示:
private byte[] _bytearr;
public byte[] bytearr
{
get { return _bytearr; }
set
{
_bytearr = (value.Length %2 == 0 ?
value :
new List<byte> { value, (byte)0 }
).ToArray();
}
}
此外, value
-keyword仅存在于属性设置器中,并获得分配给该属性的名称。 由于属性不过是一组get-和set-method,因此该变量仅存在于后者中。 因此,更改其内容不会对您的实际数据产生任何影响,这只是设置程序的内部功能。
但是,自动实现的属性在getter和setter方法中没有任何逻辑,因此就这样:
public MyProperty { get; set; }
但是,编译器会将其更改为:
private _MyProperty;
public int Numerator
{
get { return _MyProperty ; }
set { _MyProperty = value; }
}
这将进一步类似于以下内容:
private _MyProperty;
public int get_MyProperty()
{
return _MyProperty ;
}
public void set_MyProperty()
{
this._MyProperty = value;
}
编辑:正如约翰尼正确指出的那样,除非三者中的一个是另一个的派生类型,并且您将其适当地转换,否则您不能使用带有三元运算符的两个不同的返回值。 因此,您的属性设置器主体应类似于Chetan Ranpariya的答案中给出的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.