了解C#属性语法和getter / setter

时间:2011-02-17 18:47:18

标签: c# syntax properties

我来自Java世界,这个结构让我疯狂:

    private static string _muiUrl;

    private static string MUIUrl
    {
        get
        {
            if (String.IsNullOrEmpty(_muiUrl))
            {
                using (var db = new IntLMPDB())
                {
                    _muiUrl =
                        (from c in db.Control where c.ControlKey == "MUI_Url" select c.ControlValue).FirstOrDefault();
                }
            }
            return _muiUrl;
        }
    }

当我在课堂上看到这个并且我想在课堂上使用该属性时,我应该怎么称呼它?

5 个答案:

答案 0 :(得分:3)

简单如下:

var result = TypeWithMUIURLProperty.MUIUrl;

可以省略其他人提到的类名,但是,为了明确,我将在此示例中保留它。

答案 1 :(得分:1)

在课堂上,您根本不需要对属性名称进行限定,即您只需编写

string url = MUIUrl;

如果该属性比private“更好”,要从完全不同的类访问该属性,您需要使用类名来限定它(但你是甚至允许在课堂内进行,这不是必需的),即

string url = ThatClassYouDidNotName.MUIUrl;

(旁注:这种延迟初始化的变体通常不是线程安全的。)

答案 2 :(得分:0)

在课堂上,只需写MUIUrl即可。这将拉出初始化值,并强制执行惰性实例化。

如果它是公开的并且您从其他地方访问它,则需要编写YourClassName.MUIUrl。但由于它是私人的,这是不必要的。

此外,只需使用MUIUrl即可在实例或其他静态成员中使用。

答案 3 :(得分:0)

当我实现具有私有后备存储的自加载属性时,我遵循永不与后备存储交互的约定,始终从属性中读取。

我觉得你需要私有字段是愚蠢的,我觉得这种类型的代码应该在{get; set;}内部继承,你应该隐式访问属性类型的字段,无论你是否直接使用它,或者回退到默认的自动属性布线。

答案 4 :(得分:0)

如果构造驱使你疯了,这里有一些解释为评论

private static string _muiUrl;
public static string MUIUrl
{
    get
    {
        //if the variable is null or empty
        if (String.IsNullOrEmpty(_muiUrl))
        {
            //using defines a scope, outside of which an object or objects will be disposed.
            //http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx
            using (var db = new IntLMPDB())
            {
                //this is linq
                //a simple example will be 
                //http://stackoverflow.com/questions/214500/which-linq-syntax-do-you-prefer-fluent-or-query-expression
                _muiUrl = (from c in db.Control 
                            where c.ControlKey == "MUI_Url" 
                            select c.ControlValue
                          ).FirstOrDefault();
                //or another linq syntax will be
                //_muiUrl= db.Control
                //        .Where(c => c.ControlKey == "MUI_Url")
                //        .FirstOrDefault()
                //        .ControlValue;
            }
        }
        return _muiUrl;
    }
}

故意将属性的访问修饰符设置为公共,因为它是如何在课外调用它的(如果是这样的话,可以随意将它设为私有)。

现在称之为,

ClassName.MUIUrl