获取方法或私有财产?

时间:2009-08-17 06:40:12

标签: c# .net

这只是一个品味问题,但我想听听你的一些意见(这也是为什么这个问题被标记为主观的原因)。

如果我有房产,请说

private string _Text;
public string Text;
get
{
   object tmp = ViewState["Text"];
   if (tmp != null)
      _Text = Convert.ToString(tmp);
   return _Text;
}
set
{
   ViewState.Add("Text", value);
}

现在这是程序员可以通过设置一些自定义文本来指定的属性。然后将其映射到UI上的某些控件。但是,在默认情况下,控件的Text来自预定义的资源文件。所以内部以更好的方式在内部处理,我有一个中心点,我检查用户是否指定了“Text”属性(上图),如果是,请使用该数据,否则依赖于默认值资源文件。

那你采取什么方法?我有两个选择:

private string ResolvedText
{
   get
   {
      if(!string.IsNullOrEmpty(Text))
         return Text;
      else
         //return the one from the resource file
   }
}

或者将所有内容都放在方法中

public string GetResolvedText()
{
   if(!string.IsNullOrEmpty(Text))
      return Text;
   else
      //return the one from the resource file   
}

这个问题对你来说可能听起来很愚蠢,因为它确实是一个小小的差别。但是我想知道是否有一些约定。

THX

5 个答案:

答案 0 :(得分:6)

就个人而言,我会使用GetResolvedText方法的主体,并在属性中使用它,因此:

private string _Text;
public string Text
{
   get
   {
     if(string.IsNullOrEmpty(_Text))
        //return the one from the resource file  
     else
        return _Text;
   }

   set
   {
      _Text = value;
   }
}

这将管理字符串的所有责任放在一个地方。如果需要原始值,类本身可以在内部访问_Text

答案 1 :(得分:3)

我发现这里最好的一般规则是:如果两次调用操作会导致多个资源调用或不同的行为 - 请使用方法。

因此,在您的示例中,如果缓存使用属性,则可以正常使用:

public string ResolvedText
{
   get { return Text ?? (Text = GetResolvedText()); }
}

然而,该方法不需要 - 用户希望它是一个更密集的操作:

public string GetResolvedText()
{
   //return the one from the resource file   
}

设计问题是你希望如何使用这个类?

一个属性将被调用,好像它是一个“便宜”的操作:

if( myInstance.ResolvedText != null && 
    myInstance.ResolvedText.Length > 5 )
    Response.Write( myInstance.ResolvedText );

方法向开发人员暗示他们应该尽可能少地调用它:

string resolvedText = myInstance.GetResolvedText();

if( resolvedText != null && 
    resolvedText.Length > 5 )
    Response.Write( resolvedText );

我个人更喜欢保持临时类的简单,所以在绝大多数情况下我会使用方法模型。

由于这是一个相当标准的约定,因此应该避免使用不缓存的属性和执行此操作的方法。

答案 2 :(得分:2)

我会将其保留为属性,因为它表示单个值,不需要大量计算来检索。

答案 3 :(得分:0)

对我来说,如果getter不能抛出异常,或者null / invalid值,那么它应该是一个属性。它是为什么属性。

但是,如果你做了一些复杂的东西,如果必须是一个函数吸气剂。显然,在这里你只有1,所以我会使用一个属性。

答案 4 :(得分:0)

重新组合你的例子和Steve的答案,再加上一些缓存,显然资源值应该只读一次,因为它永远不会改变,而且通过契约我们必须尽快从属性中返回值:

private static string ResourceText;

static [constructor]
{
    ResourceText = //get resource;
}

private string text;
public string Text;
get
{
   string tmp = (string)ViewState["Text"];
   if (!String.IsNullOrEmpty(tmp))
      text = tmp;
   else
      text = ResourceText;
   return text;
}
set
{
   ViewState.Add("Text", value);
   // Note: passing null or empty strings will not work.
}