2015-08-28 3 views
1

Я начинающий кодер, сейчас я изучаю C#, и мне было интересно, можно ли использовать Console.ReadLine() внутри заданной части свойства, а затем использовать его как метод для чтения пользовательского ввода, как показано ниже:Использовать console.ReadLine() внутри свойства set

class Employee 
{ 
    protected int empID; 
    public int EmployeeID 
    { 
     set 
     { 
      Console.WriteLine("Please enter Employee ID:"); 
      this.empID = int.Parse(Console.ReadLine()); 
     } 
    } 
    //more code here 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Employee employee1 = new Employee(); 
     employee1.EmployeeID; 
     //more code here 
    } 
} 

или единственным вариантом является использование Console.ReadLine() непосредственно в «основной», следующим образом:

class Employee 
{ 
    protected int empID; 
    public int EmployeeID { set; } 
    //more code here 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Employee employee1 = new Employee(); 
     employee1.EmployeeID = int.Parse(Console.ReadLine()); 
     //more code here 
    } 
} 

Спасибо за все ответы!


Благодарим всех вас за ответы! Теперь я вижу, что это неправильный способ написать код, и я понимаю, почему. Я думал, что с помощью 'Console.ReadLine();' в свойстве «набор» будет легче получить значение от пользователя и не придется переписывать эту часть:»

Console.WriteLine("Please enter Employee ID:"); 
this.empID = int.Parse(Console.ReadLine()); 

каждый раз, когда я буду просить у пользователя ввод. Но теперь я понимаю, почему его не следует использовать.
Еще раз благодарю вас за ответы и приятный день!

+0

Вариант №2 является лучшим. Первый вариант - это доступ к 'get' (который не определен), поэтому вместо этого вы получите ошибку. Хотя вы можете сделать что-то вроде 'mployee1.EmployeeID = 1;' вместо этого, где '1' просто будет выброшен, и ваше приглашение появится и примет значение, это действительно плохой дизайн. – tnw

+0

Я бы честно использовал get и set, а затем проанализировал значение, исходящее из настройки свойства, для простого примера того, что я говорю о проверке этой предыдущей публикации http://stackoverflow.com/questions/22262312/trouble- set-my-setter-using-console-readline – MethodMan

+0

Первый вариант просто очень странный ... ИМО это труднее читать, так как ваш код 'Main' выглядит так, как будто ничего не делает (хотя это не так), что делает вас Посмотрите куда-нибудь еще за небольшим количеством понимания. Если бы я не дал вам никакого контекста и сказал «myClass.SomeProperty;», что бы вы подумали, что он делает? Вы можете только догадываться. –

ответ

4

Да, вы можете поставить Console.ReadLine() внутри комплекта. Но это очень неправильно.

Свойства C# скомпилированы подобно методу, поэтому вы можете поместить любой доступный код C# внутри свойства, компилятор позволит вам это сделать. (Проблема в коде заключается в том, что вы не пишете правильный вызов для набора).

Но, думая о хороших практиках и S.O.L.I.D, это очень неправильно. Второй фрагмент кода выглядит намного лучше.

Просто для любопытства (не используйте это):

Для первого кода работы вам нужно переписать строку:

employee1.EmployeeID; 

Чтобы что-то вроде этого:

employee1.EmployeeID = 0; // This syntax will call the property set you wrote. 

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

+2

Этот ответ очень не прав и должен быть в лучшем случае. И если он «очень не прав», как вы уже упоминали, разместите код, который поддерживает ваш комментарий, показывающий, как OP должен использовать getter и setter для присвоения значений свойству .. – MethodMan

+0

Этот ответ основывается на вопросе * его можно использовать Console.ReadLine(), внутри установленной части свойства *, а не в коде. –

+0

это вполне возможно, но то, что вы сказали как ответ, да, но это очень неправильно, это не очень хороший ответ. Теперь, когда вы отредактировали ответ, он выглядит на 100% лучше. Однако лично вам следовало бы показать OP пример обоих ..'1' неправильный путь против '2' правильный путь .. это все, что я пытаюсь сказать .. – MethodMan

1

Вы направляетесь в неправильном направлении. Правильный способ - через метод Main.

Или, если вы хотите поставить функциональность в своем классе по какой-либо причине, это должно быть таким образом

class Employee 
{ 
    protected int empID; 
    public int EmployeeID 
    { 
     get { return empId; } 
    } 
    //more code here 
    public void AskEmployeeID() 
    { 
     Console.WriteLine("Please enter Employee ID:"); 
     this.empID = int.Parse(Console.ReadLine()); 
    } 
} 

Теперь вы можете вызвать эту функцию на Employee объекта в employee1.AskEmployeeID();

+0

Все еще плохая идея, так как теперь вы вводите зависимость от Консоли в свой класс Employee. Это делает более сложным модульное тестирование, не говоря уже о том, что повторное использование класса Employee вне консольного приложения практически невозможно (без доработки рефакторинга). – Nate222

+1

@ Nate222 Я не думаю, что создание зависимости является проблемой для OP, это ответ на новичок и OP собираются оставаться достаточно долго в мире консоли для изучения выхода. – CodetrixStudio

3
public class Employee 
{ 
    public int EmployeeID { get; set; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Please enter Employee ID:"); 

     var empID = int.Parse(Console.ReadLine()); 

     var employee1 = new Employee 
     { 
      EmployeeID = empID 
     }; 
    } 
} 

Getters и Setters следует использовать только для установки/возврата любого значения, которое имеет свойство. Вы также можете создавать частные поля и устанавливать их разными способами. Однако вы не будете звонить Console.ReadLine() из класса. Класс представляет собой представление вашего объекта.

+0

Благодарим вас за ваш ответ! – Pawel

Смежные вопросы