【问题标题】:Environment.GetCommandLineArgs - why is it a method? Why not a property?Environment.GetCommandLineArgs - 为什么它是一种方法?为什么不是财产?
【发布时间】:2012-03-25 18:11:12
【问题描述】:

我正在尝试了解创建方法Environment.GetCommandLineArgs 的团队的设计注意事项。

它可能是一个静态属性,非常类似于System.Web.HttpContext.Current。毕竟,返回的值一旦可用就不应改变。所以它更像是当前运行进程的一个属性。

我知道 .NET 中的任何属性都是 getter/setter 方法的语法糖。但这正是使用属性而不是显式 getter 方法的确切原因。

或者也许我在这里遗漏了什么?

你怎么看?

【问题讨论】:

  • BCL 团队尊重属性和方法之间的语义区别。仅当程序员可以/应该考虑对它们的调用等同于访问字段时,才使用属性。在这种情况下,GetCommandLineArgs 不能那样工作,所以它是一种方法。将其视为每次重新检索或计算值。

标签: .net methods properties environment-variables


【解决方案1】:

据我了解,方法用于动作(做某事)。所以调用一个方法意味着你正在经历一些更大的(ger)逻辑,比如计算或对数据库存储库的调用。属性基本上只是用于获取或设置变量。如果你想要一个人的名字,你将拥有一个属性'Name',并将其命名为 person.Name 而不是 person.Name()。但是如果你想要这个人的年龄并且你只有出生年份,你可能会有一个 GetAge() 方法,它具有计算年龄的基本逻辑。也许我在这里完全错了,但我的理解是方法用于更大的代码和逻辑块,而属性用于(更多)简单地设置和获取值。

【讨论】:

    【解决方案2】:

    我怀疑这是因为每次调用它时都会复制一个数组。例如,考虑这个程序:

    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”。

    所以当你说:

    毕竟,返回的值一旦可用就不应改变。

    实际上,它会在每次调用时返回不同的值(新的数组引用),正是因为数组总是是可变的。

    【讨论】:

    • 嗯……好点。我想你是对的,它应该是原始数组的 副本,因此每次调用都有一个新数组。
    • 这就是为什么我认为IReadOnlyList<T> 早就应该在框架中并且大量使用而不是数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多