Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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#中使用out和ref参数?_C#_Asp.net_Oop_Coding Style - Fatal编程技术网

什么时候应该在C#中使用out和ref参数?

什么时候应该在C#中使用out和ref参数?,c#,asp.net,oop,coding-style,C#,Asp.net,Oop,Coding Style,关于约定,我有一个非常简单的问题,方法在C#中何时应该有ref或out参数 这与遵循良好的OOP,而不仅仅是懒惰或糟糕的设计有什么关系 例如,我遇到了一个类MembershipProvider(来自.NET System.Web.Security),它有一个CreateUser方法,该方法具有out for MembershipCreateStatus并返回MembershipUser 其背后的原因是否基本上是因为当有案例时,需要从该方法获取信息,但该信息不合适/无法从该方法返回 谢谢out参数

关于约定,我有一个非常简单的问题,方法在C#中何时应该有ref或out参数

这与遵循良好的OOP,而不仅仅是懒惰或糟糕的设计有什么关系

例如,我遇到了一个类MembershipProvider(来自.NET System.Web.Security),它有一个CreateUser方法,该方法具有out for MembershipCreateStatus并返回MembershipUser

其背后的原因是否基本上是因为当有案例时,需要从该方法获取信息,但该信息不合适/无法从该方法返回


谢谢

out参数的主要用途是当您需要返回多个内容时

例如,TryParse是一个针对大量数值对象的静态方法,它在成功时需要返回true/false和强制转换值


如果需要返回多个值,有些人可能更喜欢返回具有多个属性的对象/结构;它只是首选项。

out参数的主要用途是当您需要返回多个内容时

例如,TryParse是一个针对大量数值对象的静态方法,它在成功时需要返回true/false和强制转换值


如果需要返回多个值,有些人可能更喜欢返回具有多个属性的对象/结构;这只是偏好。

想想下面的系统:

您有一个方法,它返回一个对象和某种状态(或更多实例)。现在,返回值有两个选项:

  • 创建一个包装器,它封装
    bool
    (或
    enum
    )状态和实际结果
  • 将这些n个实例分开
  • 如果必须返回2个以上的实例,我更喜欢包装器。如果签名只处理状态和结果,我更喜欢
    out
    /
    ref
    -style

    对于
    out
    /
    ref
    -样式,我更喜欢签名,例如
    TryParse
    bool TryParse(out T result)
    ,因为这样使用它时会更自然,例如:

    int foo;
    if (int.TryParse(someString, out foo)) {
       // do something with foo
    }
    
    鉴于

    MyState state;
    Foo fooInstance = FooCreator.Create(out state);
    if (fooInstance != null)
    * OR *
    if (state == State.Success)
    

    可能不是那么自然

    只要想想以下系统:

    您有一个方法,它返回一个对象和某种状态(或更多实例)。现在,返回值有两个选项:

  • 创建一个包装器,它封装
    bool
    (或
    enum
    )状态和实际结果
  • 将这些n个实例分开
  • 如果必须返回2个以上的实例,我更喜欢包装器。如果签名只处理状态和结果,我更喜欢
    out
    /
    ref
    -style

    对于
    out
    /
    ref
    -样式,我更喜欢签名,例如
    TryParse
    bool TryParse(out T result)
    ,因为这样使用它时会更自然,例如:

    int foo;
    if (int.TryParse(someString, out foo)) {
       // do something with foo
    }
    
    鉴于

    MyState state;
    Foo fooInstance = FooCreator.Create(out state);
    if (fooInstance != null)
    * OR *
    if (state == State.Success)
    
    可能不是那么自然

    根据C#:

    out关键字会导致参数为空 通过引用传递。这是相似的 指向ref关键字,但该ref除外 要求变量为 在传递之前初始化

    因此,当您需要向方法传递值以及从方法接收值时,请使用
    ref
    参数。当信息流仅从方法流向调用方时,请使用
    out
    参数。为了完成这个故事,有一个未加修饰的value参数,它将信息传递给方法,但无法从方法接收信息

    我并不认为
    out
    ref
    只在需要从一个方法返回多个项目时使用。我总是喜欢使用
    out
    从有副作用的方法返回值

    对我来说,这就是你问题的答案。如果方法没有副作用,并且如果方法名称是与返回值含义匹配的名词,则通过函数返回值从函数返回单个值。否则,通过
    out
    ref
    参数返回值。

    根据C#:

    out关键字会导致参数为空 通过引用传递。这是相似的 指向ref关键字,但该ref除外 要求变量为 在传递之前初始化

    因此,当您需要向方法传递值以及从方法接收值时,请使用
    ref
    参数。当信息流仅从方法流向调用方时,请使用
    out
    参数。为了完成这个故事,有一个未加修饰的value参数,它将信息传递给方法,但无法从方法接收信息

    我并不认为
    out
    ref
    只在需要从一个方法返回多个项目时使用。我总是喜欢使用
    out
    从有副作用的方法返回值


    对我来说,这就是你问题的答案。如果方法没有副作用,并且如果方法名称是与返回值含义匹配的名词,则通过函数返回值从函数返回单个值。否则,通过
    out
    ref
    参数返回值。

    可能重复:和@Alex部分重复。这些问题要求区分ref和out。这个问题问它们应该用来做什么。是的,我理解它们的区别和用途。这更多的是关于什么时候应该使用它,同时仍然遵循良好的面向对象原则/C#约定。可能重复:和@Alex部分重复。这些问题要求区分ref和out。这个问题问它们应该用来做什么。是的,我理解它们的区别和用途。这更多的是关于什么时候应该使用它,同时仍然遵循良好的面向对象原则/C#约定。