Почему программа работает? (C#)
Код:
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
}
{
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
}
Оператор new выделяет место не в стеке, а в основной памяти, потому и работает.
Цитата: Maximillian_Cavalera
Как известно нельзя возвращать ссылки на локальные переменные.
А где здесь ссылка на локальную переменную? Здесь я вижу ссылку на объект в куче.
обрати внимание на static, если локальная переменная объявлена как статик, то при завершении функции она не удаляется и при следующем вызове функции будет снова доступна, при чем ее значение так же сохраниться, во всяком случае в С++ так, не помню как static ведет себя с функциями и объектами, погугли на тему классов памяти!
Цитата: Artem_3A
обрати внимание на static, если локальная переменная объявлена как статик, то при завершении функции она не удаляется и при следующем вызове функции будет снова доступна, при чем ее значение так же сохраниться, во всяком случае в С++ так, не помню как static ведет себя с функциями и объектами, погугли на тему классов памяти!
Милейший, вы где видели static-переменные в C#?
А в чём разница между string и String?
Цитата: Maximillian_Cavalera
А в чём разница между string и String?
В первой букве.
string - ключевое слово C#, является синонимом типа System.String.
Код:
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();
}
{
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();
}
{
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();
}
Цитата:
Объясните почему код написанный выше напечатает "Class1", т. е. вызовет свойство Name класса Class1, а код написанный ниже напечатает "Class2", т. е. вызовет свойство из класса Class2.
Потому что код написанный ниже использует полиморфизм, а код написанный выше - нет.
Полиморфизм имеено для того и нужен, чтобы через интерфейс базового класса можно было работать с экземпляром производного класса.
Цитата:
И ещё, почему для вызова метода Func класса Class2, если создать объект способом описанным в методе Main, необходимо приводить типы, т.е. надо написать (c as Class2).Func(), ведь это экземпляр Class2.
Связано с первым вопросом. В интерфейсе базового класса Class1 нет метода Func. Поэтому происходит ошибка компиляции.