C# 为什么传递对象会自动成为按引用传递?

C# 为什么传递对象会自动成为按引用传递?,c#,asp.net,asp.net-mvc,reference,C#,Asp.net,Asp.net Mvc,Reference,我正在尝试对AdminController中的管理员登录进行身份验证,以下是我迄今为止所做的工作: [HttpPost] public ActionResult AdminLogin(Admin admin) { Admin newAdmin = admin; if (ModelState.IsValid) { Admin validAdmin = _iadmin.AuthenticateAdmin(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方法中设置新值

为什么这是一个自动通过引用


我以前看过,但帮不了我多少忙

AuthenticateAdmin
方法中,返回对传入的同一对象的引用

如果要返回其他对象,需要执行以下操作:

return new Admin { AdminName="", Password="" };

我想你是糊涂了;将对象传递给方法时,始终传递现有对象,而不是创建具有相同状态的新对象。这就是为什么它们被称为引用类型

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
}
通过“参考传递”,你可能会想到关键词。这会做一些不同的事情,它还会传递变量指针:

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();
}

因为类在c#中使用了按引用传递语义。这是语言的一部分。不清楚为什么这个问题对你没有多大帮助,因为它正好回答了你的问题。请解释一下。你真的在问为什么C#具有引用传递语义,或者为什么你的方法不起作用?结构和类之间的区别:@New_developer问题本身包含引用传递语义的示例。你的问题中有一个例子。类在c#中通过引用传递,因为这就是语言的工作方式。您不需要显式地告诉它这样做。@New_developer如果
Admin
是一个类,那么它就是一个引用类型,因此您可以更新该对象并将引用的副本返回给该对象。如果它是一个结构,它将在传递时复制它,因此您将返回一个不同的副本。请注意,这与变量的传递方式不同,它实际上是通过值传递的,除非该方法使用
ref
关键字。谢谢,谢谢。这解决了我的问题。我一直在努力解决这个问题。非常感谢。为了清楚起见,第一个示例是通过值参数传递引用类型,第二个示例是通过引用参数传递引用类型。还可以通过值参数传递值类型,或通过引用参数传递值类型。这里有一个很好的博客解释了这一切,
ref
关键字有更多的背景,包括上面提到的复杂之处。