C# 为什么传递对象会自动成为按引用传递?
我正在尝试对AdminController中的管理员登录进行身份验证,以下是我迄今为止所做的工作: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);
[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
关键字有更多的背景,包括上面提到的复杂之处。