Структура является типом значения, тогда почему компилятор не выдает никакой ошибки, когда строка объявляется в структуре - PullRequest
0 голосов
/ 08 июля 2010

Почему приведенный ниже код не выдает ошибку, даже если строка является ссылочным типом.

public struct example
{
   public int a;
   public string name;
};

public void usestruct()
{
example objExample= new example();
MessageBox.Show(objExample.name);
}

РЕДАКТИРОВАТЬ

Изменение ответа ДжонаВопросы.

            public struct Example 
            { 
               public int a; 
               public string name; 
            } 

            class Test 
            { 
                static void Main() 
                { 
   //Question 1
                    Example t1 = new Example(); 
                    t1.name = "First name"; 
                    Example t2 = t1; 
                    t2.name = "Second name"; 

                    Console.WriteLine(t1.name); // Prints "First name" 
                    Console.WriteLine(t2.name); // Prints "Second name"
                    Console.WriteLine(t1.name); // What will it Print ????

   //Question 2
                    Example t1 = new Example(); 
                    t1.name = "First name"; 
                    Console.WriteLine(sizeof(t1)); // What will it Print ???? 
                       // I think it will print 4 + 4 bytes. 
                       //4 for storing int, 4 for storing address of string reference.
    //Considering 
    //int of 4 bytes 
    //Memory Address of 4 byte 
    //Character of 1 byte each.
                      //My collegue says it will take 4+10 bytes 
                      //i.e. 4 for storing int, 10 bytes for storing string.
                } 
            } 

Сколько байт займет второй регистр.

1 Ответ

2 голосов
/ 08 июля 2010

Структура просто содержит ссылку на строку.Почему это может вызвать проблемы?Ссылка это просто значение.Когда вы копируете значение структуры (например, с помощью присваивания или передачи его методу), ссылка также будет скопирована.Обратите внимание, что если вы измените значение поля в одной копии структуры, это не изменит значение в другой копии:

using System;

public struct Example
{
   public int a;
   public string name;
}

class Test
{
    static void Main()
    {
        Example t1 = new Example();
        t1.name = "First name";
        Example t2 = t1;
        t2.name = "Second name";

        Console.WriteLine(t1.name); // Prints "First name"
        Console.WriteLine(t2.name); // Prints "Second name"        
    }
}

Если бы Example был классом, они обавыведите «Second name», поскольку значения t1 и t2 будут ссылками на один и тот же экземпляр.

Это также не относится к строкам - любой ссылочный тип будет работать.1010 * Однако я бы настоятельно не рекомендовал бы создавать изменяемые структуры или открывать открытые поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...