这只是一个品味问题,但我想听听你的一些意见(这也是为什么这个问题被标记为主观的原因)。
如果我有房产,请说
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
答案 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.
}