2012-03-08 5 views
8

Я пытаюсь понять конструктивные соображения команды, которая создала метод Environment.GetCommandLineArgs.Environment.GetCommandLineArgs - почему это метод? Почему не собственность?

Это могло быть статическое свойство, очень похожее на System.Web.HttpContext.Current. В конце концов, возвращаемое значение не должно меняться после его появления. Таким образом, это больше похоже на свойство текущего текущего процесса.

Я знаю, что любое свойство в .NET является синтаксическим сахаром для методов getter/setter. Но это точная причина использования свойства, а не явного метода getter.

Возможно, есть что-то, что мне здесь не хватает?

Как вы думаете?

+1

Команда BCL уважала семантическое различие между свойствами и методами. Свойства используются только тогда, когда программист может/должен рассматривать вызов, эквивалентный доступу к полю. В этом случае 'GetCommandLineArgs' не работает таким образом, поэтому это метод. Подумайте об этом как о возврате или вычислении стоимости заново каждый раз. –

ответ

4

Я подозреваю, что это потому, что он делает копию массива каждый раз, когда вы его вызываете. Например, рассмотрим следующую программу:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[] argsCopy = Environment.GetCommandLineArgs(); 
     args[0] = "x"; 

     // 0 is the command in this case 
     argsCopy[1] = "y"; 

     string[] argsCopy2 = Environment.GetCommandLineArgs(); 
     Console.WriteLine(argsCopy2[1]); 
    } 
} 

Если запустить это с «тест-оригинала», он будет по-прежнему распечатать «оригинальный».

Так что, когда вы говорите:

В конце концов, возвращаемое значение не должно измениться после того, доступны.

На самом деле, он возвращает другое значение (новый опорный массив) при каждом вызове, именно потому, что массивы всегда изменяемые.

+0

Hmmmm .. хорошо пункт. Я думаю, вы правы, это должна быть ** копия ** исходного массива, следовательно, новый массив для каждого вызова. –

+0

Вот почему я думаю, что ['IReadOnlyList '] (http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx) должно было быть в Framework долгое время назад и использовал много вместо массивов. – svick

+0

@svick: Абсолютно - но это было бы трудно сделать до дженериков ... –

0

С моей точки зрения, методы используются для действий (что-то делать). Поэтому вызов метода будет означать, что вы проходите через какую-то большую логическую логику, например, вычисление или вызов в базу данных. И свойства в основном предназначены для получения или установки переменных. Если вы хотите, чтобы у вас было имя человека, у вас будет свойство «Имя» и назовите его как person.Name, а не person.Name(). Но если вы хотите возраст человека, и у вас есть только рождение, у вас, вероятно, будет метод GetAge() с базовой логикой для расчета возраста. Возможно, я здесь совершенно не прав, но я понимаю, что методы используются для больших фрагментов кода и логики, тогда как свойства используются для (более) простого задания и получения значений.