2015-02-13 4 views
2
# вопрос

C: Как я могу использовать конструктор:конструктор с аргументами в C#

AcctHolder ah1 = new AcctHolder("Dumitru", "St", "Bucharest"); 

и быть в состоянии получить ah1.Fname? (Вместо нулевой)

using System; 

    namespace ConsoleApplication1 
    { 
     class ATM 
     { 
      public static void Main(string[] args) 
      { 
       AcctHolder ah1 = new AcctHolder("Dumitru", "St", "Bucharest"); 
       Console.WriteLine(ah1.FName); //returns null - why??? 

       AcctHolder ah2 = new AcctHolder(); 
       ah2.FName = "Dumi"; 
       Console.WriteLine(ah2.FName); // returns "Dumi" 

       Console.ReadKey(); 
      } 


      public class AcctHolder 
      { 
       private string fname, lname, city; 
       public string FName { get; set; } 
       public string LName { get; set; } 
       public string City { 
        get { return city; } 
        set { city = value; } 

       } 
       public AcctHolder(string a, string b, string c) 
       { 
        fname = a; 
        lname = b; 
        city = c; 
       } 
       public AcctHolder() 
       { 

       } 
      } 

     } 
    } 

ответ

4

Вы устанавливаете неправильно (частный) fname в конструкторе. Используйте общественность.

изменение

public AcctHolder(string a, string b, string c) 
{ 
    fname = a; 
    lname = b; 
    city = c; 
} 

в

public AcctHolder(string a, string b, string c) 
{ 
    Fname = a; 
    LName = b; 
    City = c; 
} 
+2

Этот ответ предполагает, что частные поля 'fname, lname, city' были полезны. На самом деле они избыточны, если вы предлагаете использовать свойства. Инициализация частных полей поддержки свойств (неавтоматически реализованных) в конструкторе фактически является лучшей практикой, поскольку вы можете быть уверены, что она не имеет побочных эффектов, как это имеет место, если свойство содержит другой код. –

2

В конструкторе установите

FName = a;

вместо

fname = a;

от свойств FName и LName не нуждаются в поддержке с бо поля, так как вы используете get;set; -syntax для их объявления. Они получают это автоматически, поэтому вы можете просто удалить fname и lname из вашего кода.

10

возвращает null - why ???

Поскольку вы инициализируете несвязанные поля в конструкторе, а не полями поддержки свойств. Вам не нужно их auto-implemented properties:

public class AcctHolder 
{ 
    public string FName { get; set; } 
    public string LName { get; set; } 
    public string City { get; set; } 
    public AcctHolder(string a, string b, string c) 
    { 
     FName = a; 
     LName = b; 
     City = c; 
    } 
    public AcctHolder() 
    { 

    } 
} 

Если вы хотите сохранить поля аккомпанемента:

public class AcctHolder 
{ 
    private string fname; 
    public string FName 
    { 
     get { return fname; } 
     set { fname = value; } 
    } 

    private string lname; 
    public string LName 
    { 
     get { return lname; } 
     set { lname = value; } 
    } 

    private string city; 
    public string City 
    { 
     get { return city; } 
     set { city = value; } 
    } 
    public AcctHolder(string a, string b, string c) 
    { 
     fname = a; 
     lname = b; 
     city = c; 
    } 
    public AcctHolder() 
    { 

    } 
} 
+0

Хотя конструктору по-прежнему необходимо установить общие поля, справа (нижний пример)? – Alex

+0

@ Алекс: нет, почему? –

+0

О, неважно! Вы абсолютно правы. Еще рано утром ... – Alex

2

Поскольку вы используете autoproperties вам не нужно частные поля. Упростить:

public class AcctHolder 
{ 
    public string FName { get; set; } 
    public string LName { get; set; } 
    public string City { get;set;} 

    public AcctHolder(string a, string b, string c) 
    { 
     FName = a; 
     LName = b; 
     City = c; 
    } 
    public AcctHolder() 
    { 

    } 
} 
1

В качестве альтернативы, измените класс на использование частных строк, как у вас с городом.

 public class AcctHolder 
     { 
      private string fname, lname, city; 
      public string FName { get {return fname;} set {fname = value; } 
      public string LName { get {return lname;} set {lname = value;} } 
Смежные вопросы