Насколько я знаю в сишарпе аргументы передаются по значению. Но тогда я не понимаю вот чего. Я сейчас смотрю код, в котором присутствует такой метод:
public static string GetRequest(string Url, string UserAgent = "", CookieDictionary Cookies = null, ProxyType ProxyProto = ProxyType.None, string ProxyString = "")
{
...
try
{
HttpResponse response = request.Get(Url);
Cookies = response.Cookies;
response_html = response.ToString();
}
}
То есть он получает куки, а потом добавляет в них те что получены из ответа.
Если переменные передаются по значению то так по-идее работать не должно, но я проверил вот так:
CookieDictionary cookies = new CookieDictionary();
string url = "http://mail.ru";
string resp = Web.GetRequest(url, "", cookies, Web.ProxyType.HTTP, "127.0.0.1:8888");
resp = Web.GetRequest(url, "", cookies, Web.ProxyType.HTTP, "127.0.0.1:8888");
При втором запросе передаются куки, которые получены при первом. Кроме того в методе я пробовал добавлять свои куки через Cookies.Add() и они присутствовали в следующих вопросах. Почему это работает?
Ответ
В C# действительно аргументы передаются по значению. Вопрос только, что это за аргументы.
Если это аргументы — числа или похожие объекты (они называются типами-значениями), то они передаются таки как есть — передаётся их копия
А если аргументы — объекты классов (они называются ссылочными типами), то по значению передаётся ссылка (то есть как бы указатель, если вы знакомы с C) на объект, а не копия самого объекта. По копии ссылки объект доступен точно так же, как и по оригиналу, и это тот же самый объект.
Почему это сделано так? Дело в том, что не все объекты можно просто склонировать. И даже если это можно, что делать со ссылками на другие объекты, которые содержит данный объект? Клонировать все внутренние объекты? Это слишком долго и слишком сложно (например, что делать, если ссылки выстраиваются в цикл?). А если внутренние объекты не клонировать, возникает та же проблема: сам объект копируется, а внутренние подобъекты всё равно передадутся по ссылке.
Комментариев нет:
Отправить комментарий