Почему передача объекта автоматически становится передачей по ссылке? - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь аутентифицировать Admin Admin в моем AdminController, вот что я сделал до сих пор:

[HttpPost]
public ActionResult AdminLogin(Admin admin)
    {
        Admin newAdmin = admin;
        if (ModelState.IsValid)
        {
            Admin validAdmin = _iadmin.AuthenticateAdmin(admin);
            if(newAdmin.AdminName == validAdmin.AdminName)
            {
                ViewBag.message = "Valid";
            }
        }
        return View();
    }

public Admin AuthenticateAdmin(Admin admin)
    {
        int count = 0;
        using (SqlConnection conn = new SqlConnection(connectionString))
        {

            using (SqlCommand command = new SqlCommand(query, conn))
            {
                conn.Open();
                command.Parameters.AddWithValue("AdminName", admin.AdminName);
                command.Parameters.AddWithValue("AdminPassword", admin.AdminPassword);


                SqlDataReader reader;
                reader = command.ExecuteReader();
                while (reader.Read())
                {
                    count++;
                }
                reader.Close();
            }

        }
        if (count==0)
        {
            admin.AdminName = "";
            admin.AdminPassword = "";
        }
        return admin;
    }

Проблема заключается в следующем: когда AuthenticateAdmin(admin) выполняется, validAdmin и newAdmin иметь сохраненные значения. Насколько я понимаю, newAdmin должны иметь начальные параметры, передаваемые администратором, а когда AuthenticateAdmin запускается, validAdmin должны иметь новые значения, установленные в методе authenticate.

Почему этот автомат c передается по ссылке?

Я смотрел на кого-то, кто задавал тот же вопрос раньше, но мне не очень помогало.

Ответы [ 2 ]

4 голосов
/ 17 января 2020

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

var someObject = new SomeClass();
var sameObject = SomeMethod(someObject); // still the same object
bool theSame = someObject == sameObject; // true

SomeClass SomeMethod(SomeClass someObject)
{
    SomeClass insideMethod = someObject; // still the same object
    return insideMethod; // return object passed to method
}

Под "передачей по ссылке" вы можете подумать о ключевом слове ref. Это делает что-то другое, он также передает указатель переменной:

var someObject = new SomeClass();
var sameObject = someObject; // still the same object
SomeMethod(someObject); // now a new object
bool theSame = someObject == sameObject; // false

void SomeMethod(ref SomeClass someObject)
{
    SomeClass insideMethod = someObject; // still the same object
    someObject = new SomeObject();
}
3 голосов
/ 17 января 2020

В вашем методе AuthenticateAdmin вы возвращаете ссылку на тот же объект, который вы передали.

Если вы хотите вернуть другой объект , вам нужно сделать что-то вроде этого:

return new Admin { AdminName="", Password="" };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...