Понимание синтаксиса свойств C # и методов получения / установки - PullRequest
2 голосов
/ 17 февраля 2011

Я пришел из мира 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 ]

3 голосов
/ 17 февраля 2011

Просто так:

var result = TypeWithMUIURLProperty.MUIUrl;

Вы можете опустить имя класса, как было упомянуто другими, однако для ясности я оставлю его в этом примере.

1 голос
/ 17 февраля 2011

Внутри класса вам вообще не нужно указывать имя свойства, то есть вы просто пишете

string url = MUIUrl;

Если бы свойство было чем-то «лучше», чем просто private, для доступа к свойствуиз совершенно другого класса, вам нужно будет квалифицировать его, используя имя класса (но вы можете делать это даже внутри класса, это просто не требуется), то есть

string url = ThatClassYouDidNotName.MUIUrl;

(Дополнительное замечание: этот вариант ленивой инициализации обычно не ориентирован на многопотоковое исполнение.)

0 голосов
/ 17 февраля 2011

если конструкция сводит вас с ума, вот какое-то объяснение в виде комментария

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 
                ///185264/svobodnoe-vyrazhenie-i-vyrazhenie-zaprosa-est-li-kakie-libo-preimuschestva-odnogo-nad-drugim
                _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
0 голосов
/ 17 февраля 2011

Когда я реализую свойство самозагрузки, которое имеет частное резервное хранилище, я придерживаюсь соглашения никогда не взаимодействовать с резервным хранилищем, всегда читать из свойства.

Я считаю глупым, что вам нужно личное поле, я чувствую, что этот тип кода должен быть унаследован внутри {get; set;}, что у вас должен быть неявный доступ к полю типа свойства независимо от того, используете ли вы его напрямую или вернуться к стандартной автоматической привязке свойств.

0 голосов
/ 17 февраля 2011

Из класса, просто написав MUIUrl, все будет хорошо. Это вызовет инициализированное значение и вызовет ленивую реализацию.

Если бы он был общедоступным и вы обращались к нему откуда-то, вам нужно было бы написать YourClassName.MUIUrl. Но так как это личное, это не нужно.

Кроме того, простое использование MUIUrl будет работать внутри экземпляра или других статических членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...