【问题标题】:Java-like alternative to non-static variables in a static nested class in C# [duplicate]C# 中静态嵌套类中非静态变量的类 Java 替代方法 [重复]
【发布时间】:2018-10-30 17:54:39
【问题描述】:

我正在尝试在 C# 中重新创建我在“Efective Java”一书中找到的优雅的构建器模式,但我不是 C# 专家。

// Builder Pattern


public class NutritionFacts { 

    private final int calories; 
    private final int fat; 
    private final int sodium; 
    private final int carbohydrate;

    public static class Builder { 
        // Optional parameters - initialized to default values 
        private int calories = 0; 
        private int fat = 0; 
        private int carbohydrate = 0; 
        private int sodium = 0;

        public Builder();
        public Builder calories(int val) { calories = val; return this; } 
        public Builder fat(int val) { fat = val; return this; } 
        public Builder carbohydrate(int val) { carbohydrate = val; return this;} 
        public Builder sodium(int val) { sodium = val; return this; }

        public NutritionFacts build() { 
            return new NutritionFacts(this); 
        }
    }
    private NutritionFacts(Builder builder) { 
        calories = builder.calories; 
        fat = builder.fat; 
        sodium = builder.sodium; 
        carbohydrate = builder.carbohydrate; 
        }
}

有了这个Builder,你可以像这样创建NutritionFacts对象,一一提供构造函数参数:

NutritionFacts cocaCola = new NutritionFacts.Builder(). calories(100).sodium(35).carbohydrate(27).build();

但是,在 C# 中,静态嵌套类中似乎不允许使用非静态参数。那么,我怎么能把它翻译成 C# 呢?

提前致谢。

【问题讨论】:

  • “非静态参数”是什么意思? “静态”一词仅适用于类成员,不适用于函数参数,所以我不清楚您指的是什么。
  • 另外,您应该尝试将 Java 代码翻译成 C#。如果您在此过程中遇到问题,您可以在代码中发布问题并描述问题,包括任何错误。
  • 我认为诀窍是不要让Builder 是静态的。不确定 Java 中的什么黑魔法可以让您实例化静态类。
  • @juharr 在 Java 中,静态类与该类的成员是实例还是静态无关,而是与嵌套类是否具有对包含类的隐式引用有关。
  • 这种风格在 C# 中不是很惯用。但是,正如您所发现的,C# 中的 static 类只能有静态成员。它不能被实例化。相反,您希望它拥有的是一个非静态类(您正在实例化一个并设置实例状态)。如果您从class Builder 中删除static,它似乎应该可以工作。顺便说一句,C# 程序员会期望类的公共方法(通过构建的卡路里)将被大写 - 作为特定语言风格的问题。

标签: c# class static nested


【解决方案1】:

一种解决方案是将Builder 类拉到NutritionFacts 类之外。您也可以将名称更改为NutritionFacstBuilder

【讨论】:

  • 这如何解决问题所提出的任何问题?
  • @Servy 在 Java 中,不能将顶级类声明为“静态”。所以我的回答背后的含义是“静态”将被删除。似乎在这种情况下,“静态”在 Java 和 C# 中意味着两个非常不同的东西。
  • 是的,没错。除了没有回答 OP 的问题之外,您现在也没有回答我的问题。
  • @Servy 我想我不明白为什么顶级非静态类不会解决问题?
  • 无论类是否嵌套,您都可以同样有效地解决问题。它对问题的解决方式没有任何影响,类的名称也没有。
猜你喜欢
  • 2015-09-15
  • 2015-02-18
  • 2011-01-17
  • 2020-08-06
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多