C# 中的匿名 类

Anonymous classes in C#

在 C++ 中,我可以在一段需要的代码中声明一个功能齐全的匿名 class,这样如果我只需要一次就不必声明它。

代码应该是这样的

Class MyClass
{
    Class
    {
        String string1;
        String string2;

        void MyMethod();
    } Strings;
}

并称其为MyClass.Strings.string1MyClass.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!";