Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему программа работает? (C#)

548
22 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Как известно нельзя возвращать ссылки на локальные переменные. Я попробовал написать программу (листинг ниже) используя ссылки на локальные переменные и она работает. Можете объяснить почему она работает:
Код:
class class1
{
  public int x;
}

static class1 func(int x)
{
  class1 c = new class1();
  c.x = x;
  return c;
}

static void main()
{
  class1 c = func(10);
 Console.WriteLine(c.x);
 // данная программа напечатает число 10
}
1.6K
22 июня 2008 года
Vov4ick
476 / / 01.02.2007
Оператор new выделяет место не в стеке, а в основной памяти, потому и работает.
5
23 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Maximillian_Cavalera
Как известно нельзя возвращать ссылки на локальные переменные.

А где здесь ссылка на локальную переменную? Здесь я вижу ссылку на объект в куче.

307
23 июня 2008 года
Artem_3A
863 / / 11.04.2008
обрати внимание на static, если локальная переменная объявлена как статик, то при завершении функции она не удаляется и при следующем вызове функции будет снова доступна, при чем ее значение так же сохраниться, во всяком случае в С++ так, не помню как static ведет себя с функциями и объектами, погугли на тему классов памяти!
5
23 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Artem_3A
обрати внимание на static, если локальная переменная объявлена как статик, то при завершении функции она не удаляется и при следующем вызове функции будет снова доступна, при чем ее значение так же сохраниться, во всяком случае в С++ так, не помню как static ведет себя с функциями и объектами, погугли на тему классов памяти!

Милейший, вы где видели static-переменные в C#?

548
25 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
А в чём разница между string и String?
5
25 июня 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Maximillian_Cavalera
А в чём разница между string и String?

В первой букве.
string - ключевое слово C#, является синонимом типа System.String.

548
27 июня 2008 года
Maximillian_Cavalera
157 / / 16.08.2007
Есть два класса Class1 & Class2. Второй наследуется от первого. Ниже представлен код и сам вопрос
Код:
class Class1
        {
            public String Name
            {
                get
                {
                    return "Class1";
                }
            }
        }

        class Class2 : Class1
        {
            public String Name
            {
                get
                {
                    return "Class2";
                }
            }
            public void Func()
            { Console.WriteLine("This is a method from class2"); }
        }

static void Main(string[] args)
        {
            Class1 c = new Class2();
            Console.WriteLine(c.Name);
            Console.ReadLine();
        }

Объясните почему код написанный выше напечатает "Class1", т. е. вызовет свойство Name класса Class1, а код написанный ниже напечатает "Class2", т. е. вызовет свойство из класса Class2. И ещё, почему для вызова метода Func класса Class2, если создать объект способом описанным в методе Main, необходимо приводить типы, т.е. надо написать (c as Class2).Func(), ведь это экземпляр Class2.
Код:
class Class1
        {
            public virtual String Name
            {
                get
                {
                    return "Class1";
                }
            }
        }

        class Class2 : Class1
        {
            public override String Name
            {
                get
                {
                    return "Class2";
                }
            }
            public void Func()
            { Console.WriteLine("This is a method from class2"); }
        }

        static void Main(string[] args)
        {
            Class1 c = new Class2();
            Console.WriteLine(c.Name);
            Console.ReadLine();
        }
7.3K
27 июня 2008 года
H010d Freeze
143 / / 08.08.2006
Цитата:

Объясните почему код написанный выше напечатает "Class1", т. е. вызовет свойство Name класса Class1, а код написанный ниже напечатает "Class2", т. е. вызовет свойство из класса Class2.



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

Цитата:

И ещё, почему для вызова метода Func класса Class2, если создать объект способом описанным в методе Main, необходимо приводить типы, т.е. надо написать (c as Class2).Func(), ведь это экземпляр Class2.


Связано с первым вопросом. В интерфейсе базового класса Class1 нет метода Func. Поэтому происходит ошибка компиляции.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог