Environment.GetCommandLineArgs - 为什么它是一个方法?为什么不是属性?

8
我正在尝试理解创建方法 Environment.GetCommandLineArgs 的团队的设计考虑。
它本可以是一个静态属性,非常像 System.Web.HttpContext.Current。毕竟,一旦可用,返回值不应更改。因此,它更像是当前运行进程的属性。
我知道,在 .NET 中的任何属性都是 getter/setter 方法的语法糖。但这正是使用属性而不是显式 getter 方法的原因。
或者也许我在这里漏掉了什么?
你怎么想?

1
BCL团队尊重属性和方法之间的语义区别。只有当程序员可以/应该将对属性的调用视为访问字段时,才会使用属性。在这种情况下,GetCommandLineArgs不是这样工作的,所以它是一个方法。可以想象每次都重新检索或计算该值。 - Cody Gray
2个回答

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]);
    }
}

如果您使用“test original”运行此代码,它仍然会打印出“original”。
因此,当您说:
“毕竟,返回值一旦可用就不应更改。”
实际上,它将在每次调用时返回不同的值(一个新的数组引用),因为数组始终是可变的。

嗯,说得好。我想你是对的,它应该是原始数组的副本,因此每次调用都需要一个新的数组。 - Ron Klein
这就是为什么我认为IReadOnlyList<T>早就应该在框架中使用,而不是数组。 - svick

0
据我理解,方法用于执行某些操作(做某事)。因此,调用方法意味着您正在执行一些大的(更大的)逻辑,例如计算或调用数据库存储库。而属性基本上只是用于获取或设置变量。如果您想要一个人的姓名,您将拥有一个名为“Name”的属性,并像person.Name这样调用它,而不是person.Name()。但是,如果您想要该人的年龄,而您只有出生年份,则可能会有一个名为GetAge()的方法,其中包含用于计算年龄的基本逻辑。也许我在这里完全错了,但我的理解是,方法用于更大的代码块和逻辑,而属性用于更简单的设置和获取值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接