C#对象引用未设置为对象?

时间:2011-11-18 23:16:31

标签: c#

enter image description here

public static void duel(String user, String user1, String user2)
        {
            int[] value = null;
            String winner;
            for (int i = 0; i < 2; i++)
            {
                Random rand = new Random((int)DateTime.Now.Ticks);
                int numIterations = 0;
                numIterations = rand.Next(2, 12);
                value[i] = numIterations;//This is line 286
            }
            if (value[0] > value[1])
            {
                winner = user1;
            }
            else
            {
                winner = user2;
            }
            Console.WriteLine(user + " Started a duel against " + user1 + " and " + user2 + "!");
            Console.WriteLine(user1 + " rolled " + value[0] + " and " + user2 + " rolled " + value[1] + "!");
            Console.WriteLine(winner + " is the winner!");
        }

这到底出了什么问题?当我设置int[] value = null时,它会编译,但如果我删除null,则会显示Use of unassigned local variable 'value' Line 286

7 个答案:

答案 0 :(得分:9)

是的,您必须在使用之前为value变量指定一个值 - 但是当您将其设置为null时,获得NullReferenceException当你尝试使用它时。看起来你想要一个双元素数组,所以使用

int[] value = new int[2];

但是,使用您编写的代码,您几乎肯定最终会得到两个值相同,因为您在几乎完全相同的时间创建了两个Random实例< / em>的。有关详细信息,请参阅我的article on Random

我会将Random实例传递给方法,并像这样重写它 - 没有一点点无意义的循环:

public static void Duel(Random rng, String user, String user1, String user2)
{
    // Using Next(2, 12) doesn't really mimic 2 dice of 1-6; it actually mimics
    // a single 10-sided die with values 2 to 11 inclusive.
    int score1 = rng.Next(1, 7) + rng.Next(1, 7);
    int score2 = rng.Next(1, 7) + rng.Next(1, 7);

    // Note: this is biased in favour of user2 in case of equality
    string winner = score1 > score2 ? user1 : user2;

    Console.WriteLine("{0} started a duel between {0} and {1}!",
                      user, user1, user2);
    Console.WriteLine("{0} rolled {1} and {2} rolled {3}!", user1, score1,
                      user2, score2);
    Console.WriteLine("{0} is the winner!", winner);
}

此处需要注意的事项:

  • 我们的方法取决于它本身不能正确创建的东西(Random),因此会被注入。
  • 通过滚动两个单个骰子模拟滚动两个骰子(这是我假设的目标),而不是统一选择[2, 12]范围内的单个数字。
  • Random.Next的第二个参数是独占上限(在我检查之前我弄错了)
  • 当您想根据条件选择一个或另一个表达式时使用条件运算符,并对结果做同样的事情
  • 使用composite format strings比简单连接更容易格式化字符串
  • 遵循.NET命名约定(Duel,而不是duel

答案 1 :(得分:5)

将行更改为:

int[] value = new int[2];

您需要创建一个空数组,以便以后可以使用它。

如果你没有将它设置为Use of unassigned local variable,那么你已经声明了变量,但没有给它一个值。

如果你将它设置为null然后给它一个值,但你也没有在该变量中添加任何内容。您的代码进一步向下期望能够使用元素0和1,但是虽然您声明value是一个数组,但您没有创建要放入变量的数组,因此在尝试访问时会出现错误不存在的数组的元素。

上面的代码通过将变量设置为带有2个元素的数组来修复此问题,该数组将包含数组中类型的默认值(int),在本例中为0,直到你将它们设置为等于某种东西。


糟糕的比喻时间:

想象一下,我打算在我的卧室里放一个书架。我为它腾出空间(声明变量),但是我没有在那个空间放一个书架(将变量设置为null,或者根本不设置它)。

如果我去第二个货架上买东西,我显然会遇到问题,因为虽然我在我的房间里(我的程序)已经制作了空间(一个变量)但我没有把书架放在那里(宣布一个数组进入变量)。


有关详细信息,请参阅Arrays Tutorial on MSDN

答案 2 :(得分:3)

您正在引用值[i],但您还没有实际初始化值[]。 你需要做一些像

这样的事情
value = new int[2];

答案 3 :(得分:2)

您尚未为int[]分配实例。如果您知道总会有2个值,则可以使用:

int[] value = new int[2];

如果您不知道自己只有2个值,请考虑使用List:

List<int> value = new List<int>();

答案 4 :(得分:0)

在c#中,您需要将变量初始化为某个值,否则将无法编译。要修复运行时错误,需要将值初始化为数组(而不是null)。由于你循环遍历值两次,我认为你需要做这样的事情:

int[] value = new int[2];

答案 5 :(得分:0)

您需要在某处创建阵列:

int[] value = new int[2];

答案 6 :(得分:0)

如果您只是在开头声明数组,那么您应该是安全的。

int[] value = new int[2];