创建一个接受与其返回的类型不同的属性

时间:2011-05-03 13:53:14

标签: c# .net oop properties

我在课堂上有一个公共方法。我想将其设为私有,并使用属性来公开该方法。问题是我的方法接受一个整数参数并返回一个布尔值。根据我的经验,财产必须接受并返回相同的类型。封装此方法并使用属性公开它的最佳做法是什么?

7 个答案:

答案 0 :(得分:9)

您不应该以这种方式使用属性。属性用于将get_set_调用包装到适当的后备字段,并将它们作为单个成员公开。内部生成的set_方法是void,并接受属性类型的实例作为其唯一参数。

如果您要实现的目标需要一个方法,那么公开一个方法。您可能使用的唯一解决方案是使用object

答案 1 :(得分:3)

如果传入的值与返回的值不同,则不是属性。如果你沿着这条路走下去,你将会为那些需要调用你的代码或将来维护代码的人制造混乱。

我能想到的唯一解决方案是错误,解决方法是将属性声明为object类型。

  

封装此方法并使用属性公开它的最佳做法是什么?

它必须是同一个属性吗?你能有类似的东西:

private Type2 _valueThatIsStoredAsAResultOfCallMethod;

private Type2 CallMethod(Type1 value)
{
    // Whatever logic is required here to take a value of Type1 and
    // get a value of Type2 from it
    return value.ToType2();
}

public Type1
{
    set
    {
        // value is of type Type1
        _valueThatIsStoredAsAResultOfCallMethod = CallMethod(value);
    }
}

public Type2
{
    get
    {
        return _valueThatIsStoredAsAResultOfCallMethod;
    }
}

答案 2 :(得分:1)

嗯,一般来说,通过属性调用方法(或在属性中执行任何复杂操作)是不好的做法,因为它不是类的用户期望发生的。预期的行为是获得价值。

我只是公开方法。

答案 3 :(得分:1)

public bool MyProp
{
    get;
    private set;
}


public int MyProp_AsInt
{
    set
    {
        MyProp = (value > 0) ? true : false;
    }
}

您的职能部门可以取代上述“设置”。 我只是在那里放了一些示例代码。

确保将函数的返回值指定给MyProp。

完整代码

public class MyClass
{

    public bool MyProp
    {
        get;
        private set;
    }


    public int MyProp_AsInt
    {
        set
        {
            MyProp = (value > 0) ? true : false;
        }
    }

}

public class Program
{

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.MyProp_AsInt = 1;
        System.Console.WriteLine("{0}", o.MyProp);
        o.MyProp_AsInt = 0;
        System.Console.WriteLine("{0}", o.MyProp);

        string line = System.Console.ReadLine();
    }
}

答案 4 :(得分:0)

这样做没有最佳做法,因为这是一种不好的做法。

如果你接受/回归有两种协变类型,你可以用他们最低的共同祖先来引用它们,但我仍然要小心。

答案 5 :(得分:0)

方法用于返回不同类型并接受输入。

属性不是。它们返回一种类型并且不接受任何输入。分开两者的主要因素之一。

答案 6 :(得分:0)

采用参数并返回值的方法无法很好地转换为属性,无论它使用何种类型。

该方法接受参数,然后返回结果,而参数接受值或返回值,而不是两者都在同一操作中。如果您必须先通过设置值来使用该属性,然后读取该值,这将非常直观。根本不是你通常如何使用房产。