C# 中的匿名 类
Anonymous classes in C#
在 C++ 中,我可以在一段需要的代码中声明一个功能齐全的匿名 class,这样如果我只需要一次就不必声明它。
代码应该是这样的
Class MyClass
{
Class
{
String string1;
String string2;
void MyMethod();
} Strings;
}
并称其为MyClass.Strings.string1
、MyClass.Strings.MyMethod()
等成员。这样我就可以优雅地对我的代码进行分组。
有没有办法在 C# 中做同样的事情?
This way I can elegantly group my code.
我不知道这如何帮助您优雅地对代码进行分组,但 C# 中没有这样的东西。有匿名 类 但它们只在本地范围内工作:
// inside a method:
var obj = new { String1 = "Hello", String2 = "World" };
并且您不能向它们添加方法。
你能得到的最接近的东西是内在的class/struct:
class MyClass
{
class MyStrings
{
String string1;
String string2;
void MyMethod() { ... }
}
MyStrings Strings;
}
我同意 Sweeper。此功能只会增加混乱的代码。您应该考虑使您的代码尽可能易于理解。这意味着如果你觉得你想对你的代码进行分组,给每个组它自己的功能,为什么不把这个组设为 class 并给它一个直接反映其目的的名称。
你可以做的是使用匿名 class,它在 C# 中不实现任何接口,只是派生自 object
:
var a = new { MyMember = 1, MyFunc = new Func<int>(() => 1) };
现在您可以调用此类型的两个成员:
Console.WriteLine(a.MyMember);
var retVal = a.myFunc();
但这是否会使您的代码变得更好,更容易理解它的作用?我怀疑是这样。给你的实例——即使只使用一次——一个名称来描述它们的意图——背后的想法——是什么。不要通过加密让其他人难以理解您的代码。
除此之外,您可以通过将 class 嵌套在另一个中来限制 private
的使用:
public class MyClass
{
private class Strings { /* ... */ }
}
现在,您的 class 仅对自身可见,并且在 MyClass
内可见(当然,在嵌套在 MyClass
中的其他 classes 中)。这使得无法像这样从外部访问 class:
var strings = new MyClass.Strings();
尝试使内部 class 静态化。这样你就可以使用你描述的语法:
class MyClass {
public static Strings {
public static string string1;
public static string string2;
public static void MyMethod() {}
}
}
然后您可以调用:MyClass.Strings.string1 = "Hell, world!";
在 C++ 中,我可以在一段需要的代码中声明一个功能齐全的匿名 class,这样如果我只需要一次就不必声明它。
代码应该是这样的
Class MyClass
{
Class
{
String string1;
String string2;
void MyMethod();
} Strings;
}
并称其为MyClass.Strings.string1
、MyClass.Strings.MyMethod()
等成员。这样我就可以优雅地对我的代码进行分组。
有没有办法在 C# 中做同样的事情?
This way I can elegantly group my code.
我不知道这如何帮助您优雅地对代码进行分组,但 C# 中没有这样的东西。有匿名 类 但它们只在本地范围内工作:
// inside a method:
var obj = new { String1 = "Hello", String2 = "World" };
并且您不能向它们添加方法。
你能得到的最接近的东西是内在的class/struct:
class MyClass
{
class MyStrings
{
String string1;
String string2;
void MyMethod() { ... }
}
MyStrings Strings;
}
我同意 Sweeper。此功能只会增加混乱的代码。您应该考虑使您的代码尽可能易于理解。这意味着如果你觉得你想对你的代码进行分组,给每个组它自己的功能,为什么不把这个组设为 class 并给它一个直接反映其目的的名称。
你可以做的是使用匿名 class,它在 C# 中不实现任何接口,只是派生自 object
:
var a = new { MyMember = 1, MyFunc = new Func<int>(() => 1) };
现在您可以调用此类型的两个成员:
Console.WriteLine(a.MyMember);
var retVal = a.myFunc();
但这是否会使您的代码变得更好,更容易理解它的作用?我怀疑是这样。给你的实例——即使只使用一次——一个名称来描述它们的意图——背后的想法——是什么。不要通过加密让其他人难以理解您的代码。
除此之外,您可以通过将 class 嵌套在另一个中来限制 private
的使用:
public class MyClass
{
private class Strings { /* ... */ }
}
现在,您的 class 仅对自身可见,并且在 MyClass
内可见(当然,在嵌套在 MyClass
中的其他 classes 中)。这使得无法像这样从外部访问 class:
var strings = new MyClass.Strings();
尝试使内部 class 静态化。这样你就可以使用你描述的语法:
class MyClass {
public static Strings {
public static string string1;
public static string string2;
public static void MyMethod() {}
}
}
然后您可以调用:MyClass.Strings.string1 = "Hell, world!";