Передача аргументов путем ссылки на параметры, хранящиеся в объекте структуры - PullRequest
0 голосов
/ 21 октября 2018

Я новичок в программировании и C #;Я не совсем понимаю, как передавать аргументы со структурами, и могу использовать некоторую помощь в том, чтобы заставить этот код работать ..

Я делаю программу для тестирования работы со структурами и методами.

Я пытаюсь создать два метода ..

Предполагается, что мой метод displayStudent () принимает параметры типа Student из объекта / экземпляра newStudent, созданного CreateStudent_Click.

CreateStudent_Click () Метод извлекает пользовательский ввод из трех TextBox (nameOfStudent, studentID, studentMajor) и объединяет их в одну строку (Output), которая отображается на четвертом outputTextBox после щелчка мышью по кнопке Create Student.

Myy CreateStudent_Click (), должен получить пользовательский ввод и поместить его в новый объект / экземпляр типа Student, а также передать аргумент в DisplayStudent (newStudent) и вызвать его.

Буду очень признателен за любую помощь, которую вы можете оказать.Спасибо.

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;

 namespace Student_Structure
{
     struct Student
     {
         public string name;
         public string studentID;
         public string major;
     }
     public partial class Form1 : Form
     {
          public Form1()
          {
               InitializeComponent();
          }
     }
     private void displayStudent(ref Student student)
     {
        try
        {
            student.name = nameTextBox.Text;
            student.studentID = studentIDTextBox.Text;
            student.major = majorTextBox.Text;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
     }

     private void CreateStudent_Click(object sender, EventArgs e)
     {
        // Declare a string to hold a line of output.
        string output;

        // Create an instance of student.
        Student newStudent = new Student();
        newStudent.name = nameTextBox.Text;
        newStudent.studentID = studentIDTextBox.Text;
        newStudent.major = majorTextBox.Text;
        // Clear the TextBoxes
        nameTextBox.Clear();
        studentIDTextBox.Clear();
        majorTextBox.Clear();
        displayStudent(Student.newStudent());
        // Clear the TextBox's current contents.
        foreach (Student student in newStudent)
        {

        }
     }
}

1 Ответ

0 голосов
/ 21 октября 2018

Во-первых (и это только практическое правило) struct s должно быть Неизменным .Сейчас в Интернете тысячи блогов, которые обсуждают это и почему, и лучше всего прочитать об этом.

Однако по умолчанию они изменчивы.Тем не менее, говоря об этом, в структуре используется много изменяемых структур, таких как Point, Size, Rectangle.Эти struct являются полностью изменяемыми.Это сделано (вопреки руководящим принципам) для повышения производительности, поскольку позволяет избежать необходимости создавать новые значения для операций модификации.

... Все это в стороне, если вы передаете изменяемую struct впараметр (в отличие от ссылочного типа), который вы получаете, является копией.Ничто из того, что вы делаете, не будет иметь никакого значения, если вы не пройдете мимо ref.

Учитывая Изменчивый struct

public struct Student
{
   public Student(string name, int studentId, string major)
   {
      Name = name;
      StudentId = studentId;
      Major = major;
   }

   public string Name { get; set; }
   public int StudentId { get; set; }
   public string Major { get; set; }

   public override string ToString() => Name + ", " + StudentId + ", " + Major;
}

Вы можете просто пройтипо ссылке

private void MutateStudent(ref Student student)
{
   student.Name = "asd";
   student.StudentId = 234;
   student.Major = "ertyt";
}

или

private Student AbetterMutateStudent(Student student)
{
   // this is actually a copy
   student.Name = "asd";
   student.StudentId = 234;
   student.Major = "ertyt";
   return student;
}

Пример

var student = new Student("SomeName",1,"SomeMajor");

Console.WriteLine(student);

MutateStudent(ref student);

Console.WriteLine(student);

var student2 = AbetterMutateStudent(student);

Console.WriteLine(student2);

Выход

SomeName, 1, SomeMajor
ByrRefName, 2, ByrRefMajor
ByCopyName, 3, ByCopyMajor
...