Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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/2/tensorflow/5.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参数指定给_C# - Fatal编程技术网

C# 在控件离开当前方法之前,必须将out参数指定给

C# 在控件离开当前方法之前,必须将out参数指定给,c#,C#,我是个新手,这是我第一次用列表做任何事情,所以这可能是一个非常愚蠢的问题。。。我试图将数据从一个文件读取到一个由tourism对象组成的列表中。据我所知,在向列表中添加对象之前,我需要为游客列表分配一些内容,但我不确定如何做到这一点 class Tourist { public string FirstName { get; set; } public string LastName { get; set; } public double Contributed { ge

我是个新手,这是我第一次用列表做任何事情,所以这可能是一个非常愚蠢的问题。。。我试图将数据从一个文件读取到一个由
tourism
对象组成的列表中。据我所知,在向列表中添加对象之前,我需要为
游客
列表分配一些内容,但我不确定如何做到这一点

class Tourist
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public double Contributed { get; set; }

    public Tourist(string firstName, string lastName, double money)
    {
        FirstName = firstName;
        LastName = lastName;
        Contributed = money * 0.25;
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Tourist> tourists = new List<Tourist>();

        ReadData(out tourists);
    }

    static void ReadData(out List<Tourist> tourists)
    {
        const string Input = "..\\..\\Duomenys.txt";

        string[] lines = File.ReadAllLines(Input);
        foreach (string line in lines)
        {
            string[] values = line.Split(';');
            string firstName = values[0];
            string lastName = values[1];
            double money = Double.Parse(values[2]);
            tourists.Add(new Tourist(firstName, lastName, money));
        }
    }
}
头等舱游客
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共双贡献{get;set;}
公共旅游者(字串姓氏、字串姓氏、双倍货币)
{
名字=名字;
LastName=LastName;
捐款=金钱*0.25;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
列表游客=新列表();
读取数据(输出游客);
}
静态无效读取数据(列表外)
{
常量字符串输入=“..\\..\\duomeys.txt”;
string[]lines=File.ReadAllLines(输入);
foreach(行中的字符串行)
{
string[]value=line.Split(“;”);
字符串firstName=值[0];
字符串lastName=值[1];
double money=double.Parse(值[2]);
游客。添加(新游客(名、姓、钱));
}
}
}

在离开该方法之前,必须为
out
-参数提供一个值

static void ReadData(out List<Tourist> tourists)
{
    const string Input = "..\\..\\Duomenys.txt";
    tourists = new List<Tourist>();

    string[] lines = File.ReadAllLines(Input);
    foreach (string line in lines)
    {
        string[] values = line.Split(';');
        string firstName = values[0];
        string lastName = values[1];
        double money = Double.Parse(values[2]);
        tourists.Add(new Tourist(firstName, lastName, money));
    }
}

通过将参数声明为
out
可以“保证”调用者(和编译器)您的方法将为作为该参数参数参数提供的变量设置一个值

因为您承诺了这一点,所以通过方法的每个路径都必须为此参数指定一个值

您的方法没有将值分配给
游客
。这实际上可能会导致
null
引用处出现
NullReferenceException
。如果使用
null
引用调用该方法,请添加(…)

在我看来,在初始化
Main
中已有的
游客时,您似乎可以将
out
关键字输入注意
ReadData
只修改列表的内容,而不修改
变量中存储的对列表的引用。因为您不想更改该引用(变量的值),所以不需要
out
关键字

如果希望
ReadData
对其进行初始化,则需要添加该行

tourists = new List<Tourist>()
并在
Main
中使用此选项,如:

static void Main(string[] args)
{
    List<Tourist> tourists = ReadData();
}
static void Main(字符串[]args)
{
列表游客=ReadData();
}

带有
out
的参数需要在方法体中指定,并且不能从调用站点获得其值。引述:

在方法中,就像局部变量一样,输出参数最初被认为是未赋值的,并且在使用其值之前必须明确赋值

在您的案例中,有三种解决方法:

首先,您可以将分配从调用者移动到方法:

static void Main(string[] args)
{
    List<Tourist> tourists;
    ReadData(out tourists);
}

static void ReadData(out List<Tourist> tourists)
{
    tourists = new List<Tourist>();
    //...
}

您不需要
out
-参数。应该读取并返回数据的方法不应该是
void
,而应该返回
List
。但是,
out
-参数必须在方法本身中初始化,这就是编译器抱怨的原因。
out
-参数就像方法和调用方之间的契约,它保证在方法中分配和初始化参数(好吧,后者不是真的,因为您可以分配
null
)。不仅仅是在这种情况下,在每种情况下都必须在方法结束之前设置
out
参数。@kiziu您是对的,然而,本主题中只有两条执行路径:一条执行循环,另一条不执行循环,因此我的评论无论如何都是正确的。虽然它是正确的,但我认为您答案的第一句可能会误导。“In case”可能会得出这样的结论:如果执行循环,则不需要
out
的值,这是不正确的,因为循环没有初始化参数,它只是修改它。
static void Main(string[] args)
{
    List<Tourist> tourists = ReadData();
}
static void Main(string[] args)
{
    List<Tourist> tourists;
    ReadData(out tourists);
}

static void ReadData(out List<Tourist> tourists)
{
    tourists = new List<Tourist>();
    //...
}
static void Main(string[] args)
{
    List<Tourist> tourists = ReadData();
}

static List<Tourist> ReadData()
{
    List<Tourist> tourists = new List<Tourist>();
    //...
    return tourists;
}