c#属性setter body而不声明类级属性变量

时间:2013-06-21 15:11:14

标签: c# properties

我是否需要声明一个类级变量来保存属性,或者我可以在getter / setter中引用self.{propertyname}吗?

换句话说,我可以这样做吗? (我没有在任何地方定义mongoFormId):

public string mongoFormId 
{
    get
    {
        return this.mongoFormId;
    }
    set
    {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}

8 个答案:

答案 0 :(得分:16)

您可以使用自动访问器实现自己的访问器。如果使用自动访问器,C#编译器将为您生成一个支持字段,但如果您实现自己的支持字段,则必须手动提供支持字段(或以其他方式处理该值)。

private string _mongoFormId;

public string mongoFormId 
{
    get { return this._mongoFormId; }
    set 
    {
        this._mongoFormId = value;
        revalidateTransformation();
    }
}

更新:自从提出此问题以来,C#6.0已经发布。但是,即使使用new syntax options,仍然无法提供自定义setter主体,而无需显式声明支持字段。

答案 1 :(得分:3)

如果您要使用自定义getter和setter,则需要设置一个字段变量并将值存储在那里。

使用您现在拥有的代码,您将遇到堆栈溢出异常。当您为mongoFormId分配内容时,您将执行第this.MongoFormId = value;行。这是对mongoFormId的赋值,导致执行行this.MongoFormId = value;,依此类推。它永远不会停止。

正确的方法是一个字段:

    private string _mongoFormId;
    public string mongoFormId {
        get { return this._mongoFormId; }
        set {
            this._mongoFormId = value;
            revalidateTransformation();
        }
    }

答案 2 :(得分:2)

你应该有一个支持变量。仔细看看:

get { return this.mongoFormId; }

将在mongoFormId上调用getter,它将再次调用该代码,并再次调用!定义支持变量将避免无限递归调用。

答案 3 :(得分:0)

检查MSDN Properties Overview

  

虽然属性定义通常包含私有数据成员,   这不是必需的。 get访问器可以返回一个值   访问私有数据成员。一个例子是获得的财产   方法返回系统时间。属性启用数据隐藏,   accessor方法隐藏了属性的实现。

答案 4 :(得分:0)

由于您收到了对该属性的递归调用,因此无效。 如果我没弄错的话,结果将是StackOverflowException。 您必须使用变量。

    private string mongoFormId;
    public string MongoFormId 
    {
        get
        {
            return this.mongoFormId;
        }
        set
        {
            this.mongoFormId = value;
            revalidateTransformation();
        }
    }

如果您不必执行revalidateTransformation,则可以使用auto-property。 这将在幕后为您创建背景。

public string MongoFormId { get; set; }

答案 5 :(得分:0)

使用您编写的代码,您将在get和set上创建递归无限循环。 this关键字引用当前类,而不是您所在的属性。

所以是的,你需要声明一个私有字段。为了避免混淆,请在MSDN Naming Guideline之后创建属性(对于属性使用Pascal大小写,对于私有字段使用驼峰大小写)。请为您的方法执行相同的操作,如果您遵循C#约定而不是Java,则应该RevalidateTransformation而不是revalidateTransformation

private string mongoFormId;
public string MongoFormId 
{
    get 
    { 
        return mongoFormId; 
    }
    set 
    {
        mongoFormId = value;
        RevalidateTransformation();
    }
}

答案 6 :(得分:0)

你可以做到这两点。

如果你想拥有一个类级成员变量,那么就这样做 -

public class sampleClass
{
     private string _mongoFormId;

public string mongoFormId {
            get { return _mongoFormId; }
            set {
                _mongoFormId = value;
                revalidateTransformation();
            }
        }
}

或者在课堂上这样做很简单,如果不需要revalidateTransformation()那么执行调用

public class sampleClass
{
public string mongoFormId {get; set;}
}

答案 7 :(得分:0)

public string mongoFormId {
    get {
        return this.mongoFormId;
    }
    set {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}

这样你就可以在所有路径上递归函数 我看到的唯一方法是使用私有数据成员。正如其他男孩所说的那样。