2013-06-21 45 views
7

我需要声明一个类级别的变量来保存一个属性,或者我可以在getter/setter中引用self.{propertyname}吗?c#property setter body没有声明类级属性变量

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

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

取决于您写的代码在哪里? – Mike

+3

你会得到一个与该代码的计算器:) – NibblyPig

+0

+1 StackOverflowException – meorfi

回答

12

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

private string _mongoFormId; 

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

UPDATE:既然这个问题被问,C#6.0已经发布。但是,即使使用new syntax options,仍无法提供自定义setter主体,而无需显式声明备用字段。

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

你应该有一个后盾变量。仔细看看:

get { return this.mongoFormId; } 

是要呼吁mongoFormId吸气剂,这将再次调用代码,又一次,又一次!定义一个支持变量将避免无限递归调用。

0

检查MSDN Properties Overview

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

0

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

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

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

public string MongoFormId { get; set; } 
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(); 
    } 
} 
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;} 
} 
+0

确保,他想调用'revalidateTransformation();'在setter中。你可以不用理会' - ' – meorfi

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

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