10

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

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

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

8 回答 8

20

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

private string _mongoFormId;

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

更新:自从提出这个问题以来,C# 6.0 已经发布。然而,即使使用了新的语法选项,仍然没有办法在不需要显式声明支持字段的情况下提供自定义设置器主体。

于 2013-06-21T15:16:43.463 回答
4

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

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

正确的方法是一个字段:

    private string _mongoFormId;
    public string mongoFormId {
        get { return this._mongoFormId; }
        set {
            this._mongoFormId = value;
            revalidateTransformation();
        }
    }
于 2013-06-21T15:16:15.477 回答
2

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

get { return this.mongoFormId; }

将调用 getter on mongoFormId,它将一次又一次地调用该代码!定义支持变量将避免无限递归调用。

于 2013-06-21T15:16:19.593 回答
0

检查MSDN 属性概述

虽然属性定义通常包括私有数据成员,但这不是必需的。get 访问器可以在不访问私有数据成员的情况下返回一个值。一个示例是其 get 方法返回系统时间的属性。属性启用数据隐藏,访问器方法隐藏属性的实现。

于 2013-06-21T15:16:39.643 回答
0

这将不起作用,因为您会递归调用该属性。如果我没记错的话,结果将是StackOverflowException. 您必须使用变量。

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

如果您不必执行revalidateTransformation,则可以使用自动属性。这将在幕后为您创建一个支持文件。

public string MongoFormId { get; set; }
于 2013-06-21T15:18:14.703 回答
0

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

所以是的,您需要声明一个私有字段。为避免混淆,请按照MSDN 命名指南创建属性(属性使用 Pascal 大小写,私有字段使用驼峰式大小写)。RevalidateTransformation并且请对您的方法执行相同的操作,revalidateTransformation如果您遵循 C# 约定而不是 java 的约定,则应该这样做。

private string mongoFormId;
public string MongoFormId 
{
    get 
    { 
        return mongoFormId; 
    }
    set 
    {
        mongoFormId = value;
        RevalidateTransformation();
    }
}
于 2013-06-21T15:20:26.480 回答
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;}
}
于 2013-06-21T15:21:08.873 回答
0
public string mongoFormId {
    get {
        return this.mongoFormId;
    }
    set {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}

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

于 2013-06-21T15:28:21.093 回答