繁体   English   中英

C#自定义自动属性设置器不允许我按摩值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM