Параметр Out в c#

Я новичок в C#. Я пробовал это с параметром out в C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class First
{
    public void fun(out int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(out x);
    }
}

, но я получаю некоторые ошибки, такие как "использование неназначенного параметра "m"" и
параметр out 'm' должен быть назначен до того, как элемент управления покинет текущий метод.

Так в чем же смысл этих ошибок и почему обязательно присваивать 'm ' когда мне уже присвоено значение x.

5 ответов


ref означает, что вы передаете ссылку на переменную, которая объявлена и инициализации, перед вызовом метода, и что метод может изменить значение этой переменной.

out означает, что вы передаете ссылку на переменную, которая была объявлена, но еще не инициализирован, перед вызовом метода, и что метод должен инициализировать или установить его значение перед возвратом.


вы получаете и ошибку, потому что переменная отправляет методу как out параметр не должен инициализироваться перед вызовом метода. После 100% правильный код:

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x;
        f.fun(out x);
    }
}

Похоже, вы ищете ref вместо out здесь:

class First
{
    public void fun(ref int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(ref x);
    }
}

out параметры предназначены для того, когда функция хочет передать значение из сам по себе. То, что вы хотите здесь ref, когда функция ожидает, что она будет передана, но может изменить ее.

для примеров того, как оба должны использоваться, прочитайте http://www.dotnetperls.com/parameter. Это объясняется в простых терминах, и вы должны быть в состоянии получить хорошее понимание этого.

следует отметить, что в вашем коде, вы никогда не доступ к переменной после вызова функции, поэтому ref ничего не делает. Ее цель-отправить изменения обратно в исходную переменную.


начиная с C# 7.0 была введена возможность объявлять переменную прямо в точке, где она передается в качестве аргумента out.

перед:

public void PrintCoordinates(Point p)
{
    int x, y; // have to "predeclare"
    p.GetCoordinates(out x, out y);
    WriteLine($"({x}, {y})");
}

C# 7.0

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

вы даже можете использовать ключевое слово var:

p.GetCoordinates(out var x, out var y);

будьте осторожны с областью действия параметра out. Например, в следующем коде "Я" используется только в if-statement:

public void PrintStars(string s)
{
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
    else { WriteLine("Cloudy - no stars tonight!"); }
}

дополнительная информация может быть найдена здесь. Эта ссылка не только о out параметр, но все новые функции, появившиеся в c# 7.0


public void Ref_Test(ref int x)
{
    var y = x; // ok
    x = 10;
}

// x is treated as an unitialized variable
public void Out_Test(out int x)
{
    var y = x; // not ok (will not compile)
}

public void Out_Test2(out int x)
{
    x = 10;
    var y = x; // ok because x is initialized in the line above
}