Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过其公共访问器访问本地私有变量是否是一种糟糕的形式?_C# - Fatal编程技术网

C# 通过其公共访问器访问本地私有变量是否是一种糟糕的形式?

C# 通过其公共访问器访问本地私有变量是否是一种糟糕的形式?,c#,C#,我正在开发一个多线程应用程序。我正在处理报告并跟踪当前批次中的报告数量以及处理的报告总数。每当我更新计数器时,我还需要更新GUI上的标签,因为进程位于单独的线程上,所以需要调用委托。哪一种方法更好 private void UpdateTotalCount(int newValue) { totalCount = newValue; if (labelTotalCount.InvokeRequired) BeginInvoke((MethodInvoker) de

我正在开发一个多线程应用程序。我正在处理报告并跟踪当前批次中的报告数量以及处理的报告总数。每当我更新计数器时,我还需要更新GUI上的标签,因为进程位于单独的线程上,所以需要调用委托。哪一种方法更好

private void UpdateTotalCount(int newValue)
{
    totalCount = newValue;
    if (labelTotalCount.InvokeRequired)
        BeginInvoke((MethodInvoker) delegate() { 
            labelTotalCount.Text = "Total reports:" + totalcount; });
    else
        labelTotalCount.Text = "Total reports:" + totalcount;
}

编辑:好的,第三个选项


private void UpdateTotalCountLabel()
{
    if (labelTotalCount.InvokeRequired)
        BeginInvoke((MethodInvoker) delegate() { 
            labelTotalCount.Text = "Total reports:" + totalcount; });
    else
        labelTotalCount.Text = "Total reports:" + totalcount;
}
// code elsewhere would look like this
totalCount++;
UpdateTotalCountLabel();
//or
totalCount+= curBatch.Length;
UpdateTotalCountLabel();

我认为使用公共访问器更好,因为它允许更多可维护的代码,以防以后需要更改计算总值的方式。这样,TotalValue属性的用户就不必担心您的更改,因为这些更改不会以任何方式影响他们的代码。

我将使用observer设计模式,并将更新逻辑移动到observer类。
不要将逻辑和GUI混用。

(更新:我误读了选项的顺序,并将它们颠倒了过来-EM)

因为您的代码正在“做一些事情”(在外部组件上设置计数标签),所以通常认为第一种形式更好

然而,OOP纯粹主义者在这一点上与我的观点大相径庭,这两个版本都不是大错特错。这两个我都看过了。我不会为了好玩而重写看起来像#2的代码

在某些情况下,第二种选择实际上可能比第一种更明智。例如,如果代码出于其他原因需要跟踪计数器,并设置和获取了大量计数器,那么将写入标签视为视图副作用,将count属性的设置/获取视为主要工件可能是有意义的。在这种情况下,我会选择属性get/set对

更新: 关于新的第三种选择:

事实上,我不推荐这个想法。现在,您已经将两个始终必须同时发生的操作分离为两个单独的代码;这是净损失。您可能会忘记在代码中的某个地方执行其中一项操作。无论是#1还是#2都比#3好。

我实际上喜欢#1,因为它清楚地表明您正在做一些事情,而不是设置字段


但是,我同意Mykola的观点,即您的UI交互不应属于支持逻辑所属的类。

我一直认为属性等同于get/set访问器方法。get/set访问器的经验法则是,它们通常应该用于公共接口。如果一个类正在调用它自己的访问器方法,那么它们可能位于另一个类中

我认为这是一种代码气味。

< P>我更喜欢第一个或

private void UpdateTotalCount(int newValue)
{
    totalCount = newValue;
    if (labelTotalCount.InvokeRequired)
        BeginInvoke((MethodInvoker) delegate() { 
            labelTotalCount.Text = "Total reports:" + totalcount; });
    else
        labelTotalCount.Text = "Total reports:" + totalcount;
}
第二个我不喜欢,因为它破坏了封装。我还将修改方法名称,使其更具描述性,例如“UpdateTotalLabelCountAsync”,因为该方法就是这样做的

由于您现在正在编写代码,因此可以将其放在属性setter中。但是,当其他人甚至您以后去做维护工作时,您可能看不到标签是如何设置的。使用该方法,至少您确切地知道标签是如何设置的。属性还用于存储未在UI中更新的数据。您也可以将属性移出UI层并存储另一个位置。

我喜欢选项4:

private int totalCount;
public int TotalCount
{
    get { return totalCount; }
    set {
            totalCount = value;
            UpdateTotalCountLabel(totalCount);
        }
}

清晰地描述意图和范围,易于遵循逻辑——什么是不喜欢的?

是的,但前提是场景的复杂性证明了这一点。如果你所做的只是设置一个标签,那么一个观察者就太过分了。将逻辑从GUI中分离永远不会过分。最好从一开始就直截了当,否则就永远无法实现;我不同意。这完全取决于具体情况。添加一个额外的类和一个抽象层只是为了在一个小程序上“设置一个标签”,这肯定是过火了。抽象必须在那里帮助你,是的。对于小程序,这是真的。小程序往往会发展成为企业应用程序。他处理报表和多线程接缝,就像处理严肃的事情一样。我倾向于同意Mykola的观点。如果一开始看起来像是一个小程序的东西可以发展成一个巨大的东西,那么最好尽早地将这些模式准备好,而不是等到改进成本更高的时候。totalValue属性不被其他任何人使用。著名的遗言,我知道,但在这种情况下,这是真的,我同意。当我写它的时候,它“有味道”。但第一个似乎没有好多少。您认为我添加的第三个选项如何?我认为理想情况下,记录的收集将保留其自己的对象。此集合将有一个更新的事件,然后查看器可以将其挂接。
private int totalCount;
public int TotalCount
{
    get { return totalCount; }
    set {
            totalCount = value;
            UpdateTotalCountLabel(totalCount);
        }
}