【问题标题】:Dealing with the multiple properties returning the new object处理返回新对象的多个属性
【发布时间】:2017-06-23 20:37:36
【问题描述】:

我的项目中有很多属性(大约 20 个),它们返回同一个类的新对象(传递了不同的参数),因此代码看起来是多余的。是否有任何方法或设计模式可以减少代码量并执行相同的操作。我确实搜索并尝试但找不到任何东西。我的代码是这样的:

        public MyClass Prop1
        {
            get
            {
                return new MyClass(0, 0);
            }
        }

        public MyClass Prop2
        {
            get
            {
                return new MyClass(0, 1);
            }
        }

        public MyClass Prop3
        {
            get
            {
                return new MyClass(1, 1);
            }
        }

        public MyClass Prop4
        {
            get
            {
                return new MyClass(2, 4);
            }
        }

任何帮助将不胜感激。谢谢。

编辑:

我正在使用 iTextSharp 生成 PDF,我必须在其中传递不同的颜色,因此我正在创建具有所需颜色的属性并在生成 PDF 时使用它们。 这里MyClassiTextSharpBaseColor 类,传递的参数是RGB 值。每个属性都会生成不同的颜色。

【问题讨论】:

  • 为什么每次调用都返回一个新实例?也许你应该考虑缓存...
  • 你能用一些收藏吗?
  • 其实每次都需要新对象通过传递RGB值来生成新颜色。
  • 由于这些是通过属性公开的,因此您需要它们所在的类的实例来获取这些对象。您确定不希望它们是静态的吗?
  • 请提供有关您正在执行的操作的更多信息。除非有正在解决的问题的某些背景,否则不可能提供有用的建议。

标签: c# .net c#-4.0 properties itext


【解决方案1】:

让它看起来更干净的一种方法是使用内联属性

public MyClass Prop1 => new MyClass(0, 0);
public MyClass Prop2 => new MyClass(0, 1);
public MyClass Prop3 => new MyClass(1, 1);
public MyClass Prop4 => new MyClass(2, 4);

这会让它看起来更干净一些,按照@John 的建议创建一个数组可以工作,但是你需要记住你有多少属性并且它不会在智能感知中显示。更好的选择实际上可能是

public MyClass Prop1 { get; } = new MyClass(0, 0);
public MyClass Prop2 { get; } = new MyClass(0, 1);
public MyClass Prop3 { get; } = new MyClass(1, 1);
public MyClass Prop4 { get; } = new MyClass(2, 4);

【讨论】:

  • 到目前为止,我将使用您建议的内联属性,并且我的代码看起来更干净。谢谢。 :)
【解决方案2】:

任何时候您的变量或属性名称中都包含数字,这就是代码异味。看看能不能换成数组。

例子:

class Example
{
    static private readonly MyClass[] _myClasses;

    static public Example()
    {
        _myClasses= new MyClass[] { new MyClass(0,0),
                                    new MyClass(0,1),
                                    new MyClass(1,1),
                                    new MyClass(2,4) };
    }

    public MyClass[] Prop
    {
        get
            {
                return _myClasses;
            }
    }
}

然后使用属性,而不是调用

var c = example.Prop1;

使用

var c = example.Prop[0];

【讨论】:

  • 谢谢解答,我试试用这种方式实现。
  • 这是一个很好的方法,但唯一的问题是当我访问这些属性时,我不知道访问了哪个属性(名称)。 :-/
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2020-09-02
  • 2014-03-15
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
相关资源
最近更新 更多