不声明类级属性变量的c#属性设置器体

不声明类级属性变量的c#属性设置器体,c#,properties,C#,Properties,我是否需要声明一个类级变量来保存属性,或者我可以只引用getter/setter中的self.{propertyname} 换句话说,我可以这样做吗?(我没有在任何地方定义mongoFormId): 如果要使用自定义getter和setter,则需要设置一个字段变量并将值存储在那里 使用现在的代码,您将遇到堆栈溢出异常。当您向mongoFormId赋值时,您将执行this.mongoFormId=value行。这是对mongoFormId的赋值,导致执行行This.mongoFormId=val

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

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


如果要使用自定义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();
        }
    }

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

get { return this.mongoFormId; }
将调用
mongoFormId
上的getter,它将一次又一次地调用该代码!定义支持变量将避免无限递归调用。

检查

虽然属性定义通常包括私有数据成员, 这不是必需的。get访问器可以返回一个不带 访问私有数据成员。一个例子是一个属性,它的get 方法返回系统时间。属性启用数据隐藏,而 访问器方法隐藏属性的实现


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


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

这将不起作用,因为您得到了对属性的递归调用。 如果我没有弄错的话,结果将是一个
StackOverflowException
。 必须使用变量

    private string mongoFormId;
    public string MongoFormId 
    {
        get
        {
            return this.mongoFormId;
        }
        set
        {
            this.mongoFormId = value;
            revalidateTransformation();
        }
    }
如果不必执行
revalidateTransformation
,可以使用auto属性。 这将在幕后为您创建一个backingfield

public string MongoFormId { get; set; }

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

是的,您需要声明一个私有字段。为避免混淆,请按照创建属性(属性使用Pascal大小写,私有字段使用驼峰大小写)。请对您的方法执行同样的操作,如果您遵循的是C#约定而不是java的约定,那么应该是
RevalidateTransformation
而不是
RevalidateTransformation

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

你可以用两种方法来做

如果您想拥有一个类级别的成员变量,那么可以这样做-

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;}
}
这样,所有路径上都有递归函数
我看到的唯一方法是使用私有数据成员。正如其他男孩所说。

视情况而定,你写的代码去哪里了?你会得到一个stackoverflow代码:)+1 StackOverflowException确保,他想调用
revalidateTransformation()在setter中。你不需要注意就可以得到“-”
public class sampleClass
{
     private string _mongoFormId;

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