В C# значения в Списке упакованная <структура>?

Я решил эту проблему следующим образом:

Добавить промежуточное программное обеспечение для обработки ответа, если оно является перенаправлением для запроса ajax, изменить ответ на нормальный ответ с URL-адресом перенаправления.

class AjaxRedirect(object):
  def process_response(self, request, response):
    if request.is_ajax():
      if type(response) == HttpResponseRedirect:
        r = HttpResponse(json.dumps({'redirect': response['Location']}))
        return r
    return response

Затем в ajaxComplete, если ответ содержит перенаправление, он должен быть перенаправлен, поэтому измените местоположение браузера.

$('body').ajaxComplete(function (e, xhr, settings) {
   if (xhr.status == 200) {
       var redirect = null;
       try {
           redirect = $.parseJSON(xhr.responseText).redirect;
           if (redirect) {
               window.location.href = redirect.replace(/\?.*$/, "?next=" + window.location.pathname);
           }
       } catch (e) {
           return;
       }
   }
}
32
задан Roman Starkov 19 February 2009 в 07:52
поделиться

7 ответов

Нет никакой упаковки.

"нет, Не будет никакой упаковки. Это было одной из основных целей дизайна Дженериков".

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/359cf58a-f53d-478e-bc31-1507e77c9454/

, "Если тип значения используется для типа T, компилятор генерирует реализацию List<T> класс специально для того типа значения. Это означает элемент списка List<T>, объект не должен быть упакован, прежде чем элемент может использоваться, и после того, как приблизительно 500 элементов списка создаются, память, сохраненная, не упаковывая элементы списка, больше, чем память раньше генерировала реализацию класса".

http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

35
ответ дан 27 November 2019 в 20:22
поделиться

Это не упаковывается, но данные будут копия из оригинала, и каждый раз, когда Вы выводите данные, это скопирует снова . Это имеет тенденцию помогать потерять изменения. По сути, необходимо стремиться не писать изменяемые структуры. Если MyStruct на самом деле не представляет единицу измерения (или подобный), сделайте ее классом. И если это мера, сделайте это неизменным (никакие общедоступные устанавливаемые участники).

И так или иначе, не выставляйте поля! Используйте свойства;-p

, Например:

struct MyStruct {
    public MyStruct(int val1, decimal val2) {
        this.val1 = val1;
        this.val2 = val2;
    }
    private readonly int val1;
    private readonly decimal val2;
    public int Val1 {get {return val1;}}
    public decimal Val2 {get {return val2;}}
}

Или альтернативно (C# 3.0):

struct MyStruct {
    public MyStruct(int val1, decimal val2) : this() {
        Val1 = val1;
        Val2 = val2;
    }
    public int Val1 {get; private set;}
    public decimal Val2 {get; private set;}
}
19
ответ дан 27 November 2019 в 20:22
поделиться

Нет, List<T> ничего не упаковывает. Внутренне это хранит свои значения в простом массиве:

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection,    IEnumerable
{
    // Fields
    private const int _defaultCapacity = 4;
    private static T[] _emptyArray;
    private T[] _items;
    private int _size;
9
ответ дан 27 November 2019 в 20:22
поделиться
typeof(List<>) // or informally List`1

... универсальный тип. Универсальные типы или параметризованные типы являются особенными в этом, они компилируются нормальным способом, но во времени выполнения они компилируются все снова и снова в зависимости от их использования.

, Если Вы помещаете ValueType в универсальный список, например, List< интервал> поведение во время выполнения к угрозе что, как будто это хранило интервал типа (который является копией значением). Упаковка не должна происходить, потому что Вы не должны рассматривать, то, как будто тип этого Списка '1 является чем-то другим, чем интервал

Перед.NET 2.0, это не могло быть сделано так, печально известный класс ArrayList поддержал массив объектов, которые означали, что ValueType (ints или структуры) должен был быть упакован, чтобы быть помещенным в тот контейнер.

Это не должно быть перепутано с дженериками Java, который является чем-то совершенно различным. Дженерики Java были реализованы со стиранием типа, которое не дает Вам то же самое повышение производительности. То, что делает Java, - то, что, после того как компилятор закончил проверку типа, это бросит все для возражения. Поэтому Вы наклоняетесь, делают отражение с дженериками Java, в то время как Вы можете с.NET универсальная система типов.

4
ответ дан 27 November 2019 в 20:22
поделиться

Список хранит все в массивах типа T. Нет никакой упаковки, но массив выделяется на "куче".

2
ответ дан 27 November 2019 в 20:22
поделиться

Нет никакой упаковки, вот почему это немного быстрее, чем неуниверсальный путь.

1
ответ дан 27 November 2019 в 20:22
поделиться

Никакая упаковка, это - один из Преимущества Дженериков :

List<int> list1 = new List<int>();    
// No boxing, no casting:
list1.Add(3);

// Compile-time error:
// list1.Add("It is raining in Redmond.");
0
ответ дан 27 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: