C# Getter Setter

3

我正在做一个关于分数的作业。我希望防止用户输入小于1的分母("nenner")和分子("zähler")。我尝试使用set实现,但它并不起作用。如果分子/分母小于1,我希望将它们设置为1。如有关于我的代码错误的任何提示,将不胜感激。

namespace Aufgabenblatt2
{
class Bruch
{
    private int zähler;
    public int Zähler
    {
        get { return zähler; }
        set 
        {
            if (value < 1)
            {
                //Console.WriteLine("Keine negativen Brüche und Division durch 0 erlaubt! Wert wurde auf 1 gesetzt");
                zähler = 1;
            }
            else
                zähler = value; 
        }
    }

    private int nenner;
    public int Nenner
    {
        get { return nenner; }
        set
        {
            if (value < 1)
            {
                //Console.WriteLine("Keine negativen Brüche und Division durch 0 erlaubt! Wert wurde auf 1 gesetzt");
                nenner = 1;
            }
            else
                nenner = value;
        }
    }


    public Bruch(int zähler, int nenner)
    {
        this.zähler = zähler;
        this.nenner = nenner;
    }

    /// <summary> 
    /// addiert zum Bruch einen weiteren hinzu 
    /// </summary> 
    /// <param name="summand">Summand</param> 
    /// <returns>Summe</returns> 
    public Bruch Addiere(Bruch summand)
    {
        Bruch ergebnis = new Bruch(this.zähler * summand.nenner + summand.zähler * this.nenner, this.nenner * summand.nenner);
        return ergebnis;
    }

    public override string ToString()
    {
        return String.Format("{0}/{1}", this.zähler, this.nenner);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.Write("Eingabe erster Zähler:");
        int zähler1 = Convert.ToInt32(Console.ReadLine());       //Read numerator value from console and save to int zähler
        Console.Write("Eingabe erster Nenner:");
        int nenner1 = Convert.ToInt32(Console.ReadLine());       //Read denominator value from console and save to int nenner

        Bruch b1 = new Bruch(zähler1, nenner1);      


        Console.Write("Eingabe zweiter Zähler:");
        int zähler2 = Convert.ToInt32(Console.ReadLine());       //Read second numerator
        Console.Write("Eingabe zweiter Nenner:");
        int nenner2 = Convert.ToInt32(Console.ReadLine());       //Read second denominator

        Bruch b2 = new Bruch(zähler2, nenner2);      

        Console.WriteLine("{0} + {1} = {2}", b1, b2, b1.Addiere(b2));   //Print both fractions, compute and print sum on Console

        Console.ReadLine();
    }
}

}


1
你应该将代码示例的焦点缩小到你感到困惑的部分。目前来看,我完全不知道你的问题是什么。 - Kirk Woll
1
+1 分,因为你一开始就提到这是作业。 - Kevin
如果你运行这个程序,输出是什么?你是如何调用这些getter-setter的? - Nathan
4个回答

8
您没有使用setter方法。在Bruch b1 = new Bruch(zähler1, nenner1);中,您在构造函数中设置了字段,而不是属性
请将构造函数更改为设置属性:
public Bruch(int zähler, int nenner)
{
    Zähler = zähler;
    Nenner = nenner;
}

您可以通过在setter处设置断点并查看它们是否被调用,然后沿着代码跟踪回到值被设置的位置来捕捉此错误。


对于断点建议加1分。如果您认为setter或getter存在问题,确认它们是否被调用是第一步。 - Matt Burland
非常感谢,我现在理解了!我确实注意到setter没有被调用,但不知道为什么。 - user3446871

3

您的问题出现在构造函数中:

public Bruch(int zähler, int nenner)
{
    this.zähler = zähler;
    this.nenner = nenner;
}

你的构造函数直接设置该字段,绕过了setter。请改为:

public Bruch(int zähler, int nenner)
{
    this.Zähler = zähler;
    this.Nenner = nenner;
}

如果你这样做,你的setter方法将被调用:
 b1.Zähler = 0; 
 Console.Writeline(b1.Zähler.ToString());     // should print 1

但是你的构造函数规避了这个问题。当属性和它们的后备字段仅通过大小写区分时,您会遇到这些问题。它们很容易混淆。这是对使用类似于 _ 的前缀来命名后备字段的一个好的论据,尽管我个人并不喜欢这种风格。


2

在构造函数中不要使用setter方法!

public Bruch(int zähler, int nenner)
{
    this.Zähler = zähler; // << Use the setter here! 
    this.Nenner = nenner;
}

另一个话题:在变量名称中不使用德语特殊字符是更好的做法。始终使用英文名称。


2
“不使用德语特殊字符(如Umlaute)作为变量名称是更好的风格。应始终使用英文名称。” 这只是一个观点。 - CodeCaster
如果你在国际团队中工作,非德语开发人员将很难理解你的代码。 - Danvil
2
如果你不这样做,或者问题领域不容易翻译成英语,那么在项目团队的母语中编写变量是可以的。这是一个古老而持续的讨论,所以我只是想说你不应该把它作为事实陈述。 :-) - CodeCaster
1
我同意避免使用umlauts(或其他奇怪的字符),但是应该使用所有团队成员都能理解的变量名称,无论是英语、德语还是其他语言。当然,如果你要在像StackOverflow这样的英语网站上发布问题,你可能会发现许多人会跳过你的问题,因为他们不能立即理解你的变量名称。 - Matt Burland

2

那是因为您设置了错误的参数。请将Bruch的构造函数替换为此代码。

public Bruch(int zähler, int nenner)
{
    this.Zähler = zähler;
    this.Nenner = nenner;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接