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
因此,如果您仍在阅读本文,请先谢谢您,但也请您告诉我在这种情况下应如何采取行动?我应该改为返回长方体对象的实例?
答案 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);
}
我还建议研究该语言的属性,访问修饰符和命名/命名惯例。