我可以在C#中将结构返回为字段初始值设定项吗?

时间:2018-10-25 22:12:21

标签: c#

Ni hao ma,stackoverflow! 想象一下,如果我在 C ++ 中拥有这样的结构:

strcut rectangle_t
{
  std::size_t width;
  std::size_t height;
  double x;
  double y;
};

因此,用相同的语言,我可以使用这种类型的函数,该函数将返回字段初始值设定项,但不会返回之前创建的对象

rectangle_t someRect()
{
  return {5, 6, 7.0, 8.0};
}

似乎我无法在 C#中执行相同的操作,此代码:

using System;

namespace MyConsoleApplication
 {
    struct rectangle_t
    {
        public uint width;
        public uint height;
        public double x;
        public double y;
    }
    class PublicStaticVoidMain
    {
        rectangle_t someRect()
        {
            return {5, 6, 7.0, 8.0};
        }
        static void Main()
        {
            rectangle_t rect;
            rect.width = 1;
            System.Console.WriteLine("$1", rect.width);
        }
    }
 }

由于这些错误而未编译:

hello.cs(16,11): error CS1525: Invalid expression term '{'
hello.cs(16,12): error CS1002: ; expected
hello.cs(16,13): error CS1002: ; expected
hello.cs(16,13): error CS1525: Invalid expression term ','
hello.cs(16,15): error CS1002: ; expected
hello.cs(16,16): error CS1002: ; expected
hello.cs(16,16): error CS1525: Invalid expression term ','
hello.cs(16,18): error CS1002: ; expected
hello.cs(16,21): error CS1002: ; expected
hello.cs(16,21): error CS1525: Invalid expression term ','
hello.cs(16,23): error CS1002: ; expected
hello.cs(16,26): error CS1002: ; expected

因此,如果您仍在阅读本文,请先谢谢您,但也请您告诉我在这种情况下应如何采取行动?我应该改为返回长方体对象的实例?

2 个答案:

答案 0 :(得分:2)

C#代码有点冗长:

rectangle_t someRect()
{
    return new rectangle_t { width = 5, height = 6, x = 7.0, y = 8.0 };
}

另一方面,任何阅读它的人都不必记住拐角坐标或尺寸是第一位的。

在较新版本的C#中,您可能更愿意将struct rectangle_t的定义替换为

using rectangle_t = (uint width, uint height, double x, double y);

然后可以使用元组语法:

rectangle_t someRect()
{
    return (5, 6, 7.0, 8.0);
}

但这并没有为您提供名为rectangle_t的实际类型,它只是一个编译时别名。

答案 1 :(得分:0)

如果要强制rectangle_t的所有实例必须具有这些值,则应使用构造函数:

public rectangle_t(uint width, uint height, double x, double y)
{
    this.width = width;
    this.height = height;
    this.x = x;
    this.y = y;
} 

然后在您的方法中可以执行以下操作:

rectangle_t someRect()
{
    return new rectangle_t(5, 6, 7.0, 8.0);
}

我还建议研究该语言的属性,访问修饰符和命名/命名惯例。