Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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#_Pass By Reference_Readability - Fatal编程技术网

C# 在有副作用的方法中最大化代码可读性?

C# 在有副作用的方法中最大化代码可读性?,c#,pass-by-reference,readability,C#,Pass By Reference,Readability,我使用的方法会对传递的引用参数产生副作用。我对代码的一个主要关注点是可读性,我认为这是一个可能引起混淆的情况 例如: class Program { static void Main(string[] args) { var simplePOCO = new SimplePOCO(); // Method 1: causes side effects, but potentially unclear Method1(simpleP

我使用的方法会对传递的引用参数产生副作用。我对代码的一个主要关注点是可读性,我认为这是一个可能引起混淆的情况

例如:

class Program
{
    static void Main(string[] args)
    {
        var simplePOCO = new SimplePOCO();

        // Method 1: causes side effects, but potentially unclear
        Method1(simplePOCO);

        // Method 2: assignment makes intentions clearer, but unnecessary
        simplePOCO = Method2(simplePOCO);

        // Method 3: ref/out makes intentions clearer, but (very?) unnecessary
        Method3(ref simplePOCO);

        // Method 4: avoid the problem altogether
        simplePOCO.SimpleProperty = Method4();
    }

    public static void Method1(SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
    }

    public static SimplePOCO Method2(SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
        return simplePOCO;
    }

    public static SimplePOCO Method3(ref SimplePOCO simplePOCO)
    {
        simplePOCO.SimpleProperty = 1;
        return simplePOCO;
    }

    public static int Method4()
    {
        return 3;
    }
}

class SimplePOCO
{
    public int SimpleProperty { get; set; }
}
我倾向于使用方法2,但我意识到这只是使用自我分配。方法4看起来也不错,但在这种情况下,需要进行一些重构才能实现——值得吗?我很好奇是否有人对此有强烈的感觉。显然,方法的正确命名将大有帮助。是否有或某些学派解决了这一问题?还有其他我没有想到的风格吗?

如果这是唯一的副作用,我会把这个方法放在它所属的地方:在
SimplePOCO
内部,这样方法和它修改的数据就被封装在一起了:

class SimplePOCO
{
    public int SimpleProperty { get; set; }
    public void Method5()
    {
       SimpleProperty = 3;
    }
}

此外,方法名称还应表明调用会导致预期的更改,即
更新SimplePropertyRandomly()

为什么不能针对SimpleCo创建方法?然后你会得到

// npn-static
simplePOCO.Method1()
// static
SimplePOCO.Method1(simplePOCO)
我同意:

public static void Method1(SimplePOCO simplePOCO) 

如果返回对象,我认为它看起来好像正在创建一个新实例。对我来说,
void
表明该方法正在处理我传入的引用。

不要浪费时间来优化像这样愚蠢的事情。第一种选择到底有什么问题?事实上,它甚至是一个静态的空白是我所担心的。static关键字是编译示例所必需的。我不是在优化,而是在寻找未来的经验法则。对于一个如此抽象的问题,很难给出一般性的建议。考虑添加更多真实世界的细节。话虽如此,方法3几乎肯定是错误的方向(参见),选项2比选项1更令人困惑。通过返回经过修改的实例,您建议原始实例(参数)没有更改,并且有人可以(比如)在方法调用之前保存引用以保留“before”快照。不要这样做。如果选项1不够清晰,那么您需要一个更好的方法名,而不是更神秘的调用约定。