【问题标题】:Understand function from get set method从get set方法理解功能
【发布时间】:2019-10-23 06:41:11
【问题描述】:

我正在使用 get set 方法循环另一个方法。如下图,我尝试增加ValuesForTableLooping类中Table10_3的值。在 Main 方法中,我调用了 get set 属性将值加一。

我手头有 2 个问题,

  1. 有没有办法调用get set方法而不把它写成Inc.Val = 0;
  2. 为什么更改Inc.Val = 0; 中的任何值都不会影响结果?
class Class2
{
    public class ValuesForTableLooping
    {
        public static int Table10_3 = 1;
    }

    public static void Main()
    {
        Console.WriteLine(ValuesForTableLooping.Table10_3);

        Increase Inc = new Increase();
        Inc.Val = 0;
        Console.WriteLine(ValuesForTableLooping.Table10_3);
        Inc.Val = 0;
        Console.WriteLine(ValuesForTableLooping.Table10_3);
        Inc.Val = 0;
        Console.WriteLine(ValuesForTableLooping.Table10_3);
    }

    public class Increase
    {
        private int val;
        public int Val
        {
            get { return val; }
            set { val = ValuesForTableLooping.Table10_3++; }
        }
    }
}

再次感谢您!

【问题讨论】:

  • 1:使用方法而不是属性。 2:将ValuesForTableLooping类也设为静态
  • setter 通常允许从外部设置一个新值。增加 setter within 的值似乎很奇怪。也许您应该改用IncreaseVal-方法。此外,一个类不应包含 verb,而通常是 noun。话虽如此,类是某种实体,而不是你可以对实体做的事情
  • 我认为这个问题可以通过对属性是什么以及如何使用它们的少量研究来解决。我认为这是一个好的开始docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 和这个docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • 提示:Inc.Val = 0; 在进入set { } 方法时,0 被放入一个名为value 的“魔法”(嗯,它存在而不在您的代码中声明)变量中。跨度>
  • 谢谢大家,我已经使用了一种方法,但我想探索各种方法来实现我的目标。我现在看到 get 和 set 是不可靠的。关于命名,我很抱歉,因为这是一个测试脚本,我是为了测试一个概念。感谢您提醒我需要遵守命名约定。

标签: c# get set


【解决方案1】:

你的设计很奇怪,你似乎对什么是属性有很大的误解。

属性什么都不是——正如你所注意到的——作为一个 get 和一个 set 方法。因此,您可以使用以下代码实现完全相同的效果:

public int get_Val() { return val; }
public void set_Val(int value) { val = ValuesForTableLooping.Table10_3++; }

这是奇怪的事情。 setter 期望您的属性有一个新值,以value 形式提供。但是,您在实现中根本不使用该值。相反,您只需将val 增加一,我称之为非常奇怪的设计。您可以使用以下方法从外部设置新值:

public void set_Val(int value) { val = value; }

或在属性符号中:

public int Val { 
    get { return val; }
    set { val = value; }
}

可以通过使用自动实现的属性进一步简化:

public int Val { get; set; }

另一种-恕我直言更好-方法是完全省略setter并创建一些IncreaseVal-method:

public void IncreaseVal() { ValuesForTableLooping.Table10_3++; }

最后但并非最不重要的一点是Increase 是一个非常糟糕的类名称。它不是描述事物,而是描述你可以用事物做的事情

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2023-03-15
    • 2011-01-05
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多