2014-12-01 3 views
2

Я пишу код, в котором у меня есть информация о клиентах, хранящихся в массиве с именем members (id, initials). Затем я запрашиваю у пользователя их идентификатор и инициалы и сопоставляю входы с хранимой информацией от элементов массива. Если они совпадают, я двигаюсь дальше. Однако я получаю ошибку в моем кодировании: «ссылка на объект требуется для доступа к методу или свойству нестатического поля». Ошибка возникает из операторов if. Любые предложения по устранению этой проблемы?C# Совпадение пользовательских входов с массивом

Некоторая справочная информация. У меня есть два класса, один называется Customer и один называется Menu. Меню является основным классом, в то время как Клиент является ссылкой класса I.

Это из моего класса Menu:

 int L = 0; 
     string I = ""; 
     Customer[] members = new Customer[2]; 
     members[0] = new Customer(3242, "JS"); 
     members[1] = new Customer(7654, "BJ"); 

     Console.Write("\nWhat is your Loyalty ID #: "); 
     L =Convert.ToInt32(Console.ReadLine()); 
     Console.Write("\nWhat is your first and last name initials: "); 
     I = Console.ReadLine(); 

       if (L==Customer.GetId()) 
        { 
        if (I == Customer.GetInitials()) 
         { 
         Console.WriteLine("It matches"); 
         } 
        } 
       else 
        { 
        Console.WriteLine("NO match"); 
        } 
       Console.ReadKey(); 
     } 
    } 
} 

Это из моего класса Customer

private int id; 
    private string initials; 
    public Customer() 
    { 
    } 

    public Customer(int id, string initials) 
    { 
     SetId(id); 
     SetInitials(initials); 
    } 
    public int GetId() 
    { 
     return id; 
    } 
    public void SetId(int newId) 
    { 
     id = newId; 
    } 
    public string GetInitials() 
    { 
     return initials; 
    } 
    public void SetInitials(string newInitials) 
    { 
     initials = newInitials; 
    } 
+1

Google «итерирует через массив в C#» и видит, можете ли вы решить проблему. Если не вернешься и покажи нам, что у тебя есть. –

+0

Вероятно, вы имеете в виду 'if (L == members [0] .GetId())'. «Клиент» не является объектом, это класс. – Mephy

+0

СПАСИБО МЕДИ. Это решило проблему. – BeginnerHelp

ответ

1

ошибка означает именно то, что он говорит. Вы не можете получить доступ к функции клиента GetId(), вызвав Customer.GetId(), потому что GetId() работает только с экземпляром Customer, а не напрямую через класс Customer.

Customer.GetId(); //this doesn't work 
Customer myCustomer=new Customer(); myCustomer.GetId(); //this works 

Чтобы проверить ввод пользователя от вашего массива входных данных, вам нужно перебирать массив (или в качестве альтернативы, использовать Linq).

Я собираюсь использовать generic list, потому что в большинстве случаев нет веских оснований для использования массивов.

List<Customer> customers=new List<Customer>(); 
Customers.Add();//call this to add to the customers list. 

foreach(var c in customers) 
{ 
    if(c.GetId() == inputId) 
    { 
     //match! 
    } 
    else 
    { 
     //not a match 
    } 
} 

Вы также можете улучшить свой класс Customer с помощью свойств или свойств авто (для которых не требуется поле для резервного копирования). Вот пример авто свойство:

public string Id {get; set;} // notice there's no backing field? 

Используя синтаксис выше авто свойство позволит вам сделать это:

var customer = new Customer(); 
string id = customer.Id; // notice there's no parentheses? 

Свойства и авто свойства позволяют для более чистого синтаксиса того, чтобы написать Java-стиль отдельный геттеры/сеттеры.

+0

Спасибо. Немного вперед для меня (новичок), но я ценю публичную строку Id {get; set;} часть. – BeginnerHelp

+0

Я не думаю, что он слишком продвинутый - это основы языка C#. Какую часть вы не понимаете? Я улучшу его с лучшим примером, если вы сообщите мне, какая часть. – mason

+0

Я еще не изучил foreach или var. – BeginnerHelp

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