Параметр 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
}