15

Здравствуйте! Начал заниматься по книге C# для школьников и столкнулся сразу же с трудностью. А именно в примерах, которые приводят в книге не понятно почему подчёркивается всё красной линией и не работает.

Допустим этот пример:

введите сюда описание изображения

using System;
class Animal
{
    public string kindOfAnimal;
    public string name;
    public int numberOfLegs;
    public int height;
    public int length;
    public string color;
    bool hasTail;
    protected bool isMammal;
    private bool spellingCorrect;
}

class Zoo
{
    public void GetAnimal()
    {
        Animal a = new Animal();
        a.kindOfAnimal = "Kangaroo";
        a.isMammal = false;
        a.spellingCorrect = true;
    }
}

А вот так правильно? Насколько я понял, мне сейчас подчёркивает две строки:

a.isMammal = false;
a.spellingCorrect = true;

Так как они protected и private? Так?

А вот скриншот из книги. Она называется C# для школьников.

введите сюда описание изображения

andreycha
  • 25,167
  • 4
  • 46
  • 82
Piston
  • 225
  • А можете поделиться цитатой или ссылкой на книгу, где такое написано? – Yurii Manziuk Apr 22 '16 at 11:58
  • В школах шарп преподают ? Это в каком классе? – koks_rs Apr 22 '16 at 12:03
  • @YuriiManziuk, это книга с майкросовтовского сайта, легко гуглится по названию. Нужный код на странице 31. https://download.microsoft.com/documents/rus/msdn/c_sharp2.pdf – Qwertiy Apr 22 '16 at 12:46
  • 4
    @Qwertiy это не книга, а зло какое-то. Надо создать тему с очень плохими примерами и книгами, чтобы никто больше не велся на такую ерунду – Yurii Manziuk Apr 22 '16 at 12:51
  • @YuriiManziuk, там ещё и поля свойствами называют - попалось, пока скроллил к примеру... – Qwertiy Apr 22 '16 at 12:52
  • @Qwertiy первый же пример (7 стр). Без установленной локализации - пытаются вывести русский текст в консоль. И нигде не указано, что могут получится краказябры в большинстве случаев) – Yurii Manziuk Apr 22 '16 at 12:54
  • @YuriiManziuk, C# замечательно работает с кодировками и выводит на консоль юникод. Вот уж тут вероятность каких-то проблем почти нулевая. Это ж не плюсы. И я очень удивлён, что в джаве с кодировками тоже фигня... – Qwertiy Apr 22 '16 at 12:56
  • @Qwertiy да, тут простите, сам виноват. только у меня наверное такие проблемы, при переустановке винды - всегда надо ручками дать ей локализацию через реестр, а то краказябры везде. (Почему у меня всегда по стандарту стоит какая-то другая кодировка и локализация, что отличается от нормальной:( ) странно, что об этой книге пишут https://megamozg.ru/post/6744/ – Yurii Manziuk Apr 22 '16 at 13:00
  • @YuriiManziuk, но ведь у шарпа юникод. Я же выводил символы вне текущей кодировки и проблем не возникало. – Qwertiy Apr 22 '16 at 13:02
  • Ответьте мне пожалуйста в чате. – Piston Apr 22 '16 at 19:36

3 Answers3

7

Да, пример в книге неправильный. Это и не должно работать.


Смотрите.

Что такое класс, по сути? Это описание объекта, которое содержит данные и действия (которые называют обычно код).

Код в классе лежит не весь одной кучей, а кусками (они называются функции или методы). В вашем примере код лежит просто в классе:

class Zoo
{
    Animal a = new Animal();
    a.kindOfAnimal = "Kangaroo";
    a.isMammal = false;
    a.spellingCorrect = true;
}

Но его нужно уложить в функцию, чтобы потом можно было этот кусок кода вызвать:

class Zoo
{
    public Animal CreateAnimal()
    {
        Animal a = new Animal();
        a.kindOfAnimal = "Kangaroo";
        a.isMammal = false;
        a.spellingCorrect = true;
        return a;
    }
}

В этом случае можно будет заставить этот кусок кода выполниться:

Zoo zoo = new Zoo();
Animal kangaroo = zoo.CreateAnimal();

Обновление:

Да, присвоение полям isMammal и spellingCorrect тоже не должно работать. Обращаться «снаружи» можно лишь к публичным (то есть, открытым) данным.

VladD
  • 206,799
  • public Animal CreateAnimal() - а это что? Тоже класс, который мы создаём? – Piston Apr 22 '16 at 12:50
  • А. Это метод, который мы создали в классе Zoo? – Piston Apr 22 '16 at 12:50
  • @Piston: Ага, это вместо кода прямо в классе я положил код в метод. – VladD Apr 22 '16 at 12:51
  • Но Animal a = new Animal(); может ведь лежать в классе Zoo. Просто члены класса Animal недоступны вне методов, конструкторов класса Zoo. – Urmuz Tagizade Apr 22 '16 at 12:55
  • Zoo zoo = new Zoo(); Animal kangaroo = zoo.CreateAnimal(); А это что? – Piston Apr 22 '16 at 12:56
  • @UrmuzTagizade "Просто члены класса Animal недоступны вне методов, конструкторов класса Zoo." нет, это не так. Дело не в недоступности методов, а в недоступности операторов. – Pavel Mayorov Apr 22 '16 at 13:21
  • @Piston: Zoo zoo — объявление переменной zoo типа Zoo. = new Zoo() — создали новый объект типа Zoo или положили в переменную. Animal kangaroo — объявили переменную типа Animal. = zoo.CreateAnimal() — запустили метод CreateAnimal объекта, лежащего в zoo, и положили в переменную (ссылку на) объект Animal, который создал этот метод в результате своей работы. – VladD Apr 22 '16 at 13:51
4

Для примера возьмем 2 класса: Animal и Elephant

class Animal{}

class Elephant{}

Экземпляр класса Animal можно создать и поместить в поле класса Elephant, но просто выполнять операторы непосредственно внутри класса (т. е. вне методов, конструкторов, свойств и т. д.) - нельзя.

class Animal
{
   public string Name;
}

class Elephant
{
   Animal elephant = new Animal();
   elephant.Name = "Слон Микки"; //Нельзя
}

К членам класса Animal (методы, поля и т.д) вы можете обращаться через конструкторы, методы, события и т.д.
Например:

class Animal
{
    public string Name;
}

class Elephant
{
    Animal animal = new Animal();

    public void GetName()
    {
        animal.Name = "Слон";
    }
}

Описал как можно кратко. Книгу, которую читаете Вы - сожгите :)
Советую для чтения книги, которые описаны: тут
Удачного кодинга...

  • 1
    Тут дело не столько в том, что нельзя к ним "обратиться в классе", сколько в том, что внутри класса не может находиться операторов, только объявления. Первая строчка не подчеркивается потому что это корректное объявление приватного поля с инициализацией - но остальные строчки корректными объявлениями не являются. – Pavel Mayorov Apr 22 '16 at 11:58
  • Очень сложно расписать свою мысль, но чуток поправил. – Urmuz Tagizade Apr 22 '16 at 12:16
  • _"но обращаться к членам Animal внутри самого класса Elephant - нельзя" - о_О – Qwertiy Apr 22 '16 at 12:40
  • Вы написали цитату. Что в ней не так? – Piston Apr 22 '16 at 12:44
  • Все так, просто я чуток не правильно выразился. Члены класса недоступны вне методов, констукторов и т.д. – Urmuz Tagizade Apr 22 '16 at 12:46
  • @Piston, кажется, исправил... – Qwertiy Apr 22 '16 at 12:52
  • Qwertiy спасибо) Я уже править начал) Нажал на ок, ошибка) У меня было бы так: Экземпляр класса Animal можно создать в самом классе Elephant, но обращаться к членам Animal внутри самого класса Elephant без использования методов, конструкторов - нельзя. – Urmuz Tagizade Apr 22 '16 at 12:53
  • Animal animal = new Animal() { Name = "Слон" }; - упс.. всё-таки можно :) – Qwertiy Apr 22 '16 at 12:58
  • Это уже синтаксический сахар) И насколько далеко можно пойти таким описанием класса?) – Urmuz Tagizade Apr 22 '16 at 13:04
  • 1
    Насколько хватит извращённости программиста: http://ideone.com/aFNiME – Qwertiy Apr 22 '16 at 13:29
  • 1
    А извращенности программистов нет предела) Док-во тому - комменты и ответы на любые вопросы) – Urmuz Tagizade Apr 22 '16 at 13:32
1

Почему все напали на пример. Он в книге абсолютно верный. Или мы читать разучились? Там же красным по белому написано, что две следующие строки не будут выполнены. Они как раз и говорят, что так писать не получится.

  • a.kindOfAnimal = "Kangaroo"; внутри класса, без метода, не откомпилируется – VladD Apr 25 '16 at 20:49
  • 1
    Да, согласен - по скриншоту видно, что там действительно всё находится внутри класса, а не внутри метода. Наверное предполагалось, что это будет внутри метода, но его забыли. Тогда да - пример из скриншота неверный, но комментарии в нём всё равно правильные, если исходить из того, что эти все эти строки должны быть в методе класса Zoo. – Alexander Y. Apr 27 '16 at 07:48