【问题标题】:Why can't we give names to properties in Tuples?为什么我们不能给元组中的属性命名?
【发布时间】:2012-09-12 11:43:55
【问题描述】:

是否有特定原因我们必须将元组中的属性称为 Item1、Item2 等。这对我来说似乎是个坏主意,因为它们很容易在您的代码中混淆。能够命名您的属性不是更有意义吗?红、绿、蓝?

【问题讨论】:

标签: c# tuples


【解决方案1】:

如果您想要名称,请不要使用元组。

匿名类型:

var t = new { Green = 1, Red  = "nice" };

if (t.Green > 0) ....

【讨论】:

    【解决方案2】:

    Tuple<...> 类只是普通的 C# 类。 C# 没有提供动态命名属性的方法(除了仅使用 Dictionary 或像 ExpandoObject 这样的动态对象)。但是,C# 确实通过匿名类型提供了您想要的东西:

    var x = new { Red = 10, Blue = 20, Green = 30 }
    var sum = x.Red + x.Blue + x.Green;
    

    匿名类型起作用的原因是它们只是动态定义自定义元组类的便捷语法。

    这些具有像命名元组一样的优点,但缺点是程序员无法命名(因此您不能创建显式返回匿名类型的方法)。

    【讨论】:

      【解决方案3】:

      如果您想这样做,请创建一个具有适当命名属性的类。当您想从一个方法返回多个值时,元组只是一种避免编写类或使用参数的快速而肮脏的方法。

      【讨论】:

      • 根据我的经验,C# 中的元组被懒惰的程序员使用。 Item1、Item2、Item3……垃圾导致各种代码维护问题。我经常在我工作的地方指导新员工,我强烈反对在 C# 代码中使用元组。我总是告诉他们按照您的建议创建一个具有适当命名属性的类。在我工作的地方,我见过多达三种不同类型的元组的代码。调试该代码是一场噩梦。
      【解决方案4】:

      元组不应该包含任何有意义的属性。它只是一组一次性的物品。

      如果您想要有意义的属性名称,请使用这些属性创建一个类型。您可以从头开始编写一个类并使用该类,也可以使用anonymous types

      【讨论】:

      • 遗憾的是,C# 没有提供任何语法糖来编写这样一个没有样板的类。
      • 所以故事的寓意是从元组中获取值并将它们存储在具有有意义名称的字段中。否则,您会在整个代码中出现 Item1、Item7、1tem3。糟糕!
      • 您是否总是必须从一开始就使用元组(即您是否使用返回元组的 API)?
      • 不,我想我只是在谈论我自己的代码中返回多个值的方法。当数据没有什么特别之处时,为可能的一两个方法编写一个类似乎是多余的。
      【解决方案5】:

      如果您总是偏爱红/蓝,您可以像这样定义类(使用泛型),否则,您可以按照其他人的建议使用匿名类型。

          class RedBluePair<T1, T2>
          {
              private T1 _Red;
              private T2 _Blue;
      
              public RedBluePair(T1 red, T2 blue)
              {
                  _Red = red;
                  _Blue = blue;
              }
      
              public T1 Red { get { return _Red;} }
      
              public T2 Blue { get { return _Blue;} }
          }
      

      【讨论】:

        【解决方案6】:

        this 帖子中复制我的答案,因为现在可以为元组中的属性命名。

        从 C# v7.0 开始,现在可以命名元组属性,以前默认为 Item1Item2 等名称。

        命名元组文字的属性

        var myDetails = (MyName: "RBT_Yoga", MyAge: 22, MyFavoriteFood: "Dosa");
        Console.WriteLine($"Name - {myDetails.MyName}, Age - {myDetails.MyAge}, Passion - {myDetails.MyFavoriteFood}");
        

        控制台输出:

        姓名 - RBT_Yoga,年龄 - 22,激情 - Dosa

        从方法返回元组(具有命名属性)

        static void Main(string[] args)
        {
            var empInfo = GetEmpInfo();
            Console.WriteLine($"Employee Details: {empInfo.firstName}, {empInfo.lastName}, {empInfo.computerName}, {empInfo.Salary}");
        }
        
        static (string firstName, string lastName, string computerName, int Salary) GetEmpInfo()
        {
            //This is hardcoded just for the demonstration. Ideally this data might be coming from some DB or web service call
            return ("Rasik", "Bihari", "Rasik-PC", 1000);
        }
        

        控制台输出:

        员工详细信息:Rasik,Bihari,Rasik-PC,1000

        创建具有命名属性的元组列表

            var tupleList = new List<(int Index, string Name)>
            {
                (1, "cow"),
                (5, "chickens"),
                (1, "airplane")
            };
        
        foreach (var tuple in tupleList)
            Console.WriteLine($"{tuple.Index} - {tuple.Name}");
        

        控制台输出:

        1 - 牛 5 - 鸡 1 - 飞机

        我希望我已经涵盖了所有内容。如果有什么我遗漏的,请在 cmets 中给我反馈。

        注意:我的代码 sn-ps 正在使用 C# v7 的字符串插值功能,详细说明 here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2016-09-20
          • 1970-01-01
          相关资源
          最近更新 更多