System.ValueType Понимание

Недавно мне нужно было перечислить все измененные файлы между двумя коммитами. Таким образом, я использовал эту (также * nix специфическую) команду

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Обновление: Или, если этан указывает ниже

git diff --name-only START_COMMIT..END_COMMIT

Использование --name-status также будет включать изменение (добавлено , измененный, удаленный и т. д.) рядом с каждым файлом

git diff --name-status START_COMMIT..END_COMMIT
30
задан SaravananArumugam 13 December 2011 в 20:26
поделиться

6 ответов

ValueType - это небольшая невинная ложь.

Все встроенные числовые типы (int, long, byte), char, перечисления и структуры являются типами значений.

Это означает, что у них разные концепции идентичности и эквивалентности типам объектов. Если я сделаю x = y , а x и y являются ссылочными типами, то теперь x и y указывают на один и тот же объект. Однако, если я сделаю x = y , а x и y являются типами значений, тогда x и y станут двумя совершенно разными объектами, которые оказываются идентичными. (Это также отражено в == и Equals , хотя это можно изменить).

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

В основном это все и хорошо, но одна вещь о ссылочных типах заключается в том, что все они выигрывают от наследования от System.Object. Тип значения int на самом деле не работает, и это тоже хорошо, поскольку во многих отношениях намного лучше, чтобы это были всего лишь четыре байта памяти, обрабатываемые прекрасными инструкциями процессора, которые так хорошо справляются с этим. Тем не менее, иногда полезно иметь возможность обрабатывать int так, как если бы он также унаследован от System.Object, и вы можете это сделать.

Конечно, это означает, что вы можете делать с int вещи, которые имеют смысл делать только с System.Object, поэтому, когда вы это сделаете, int будет «упакован», а затем может быть снова «распакован».

Это замечательно, но что, если бы мы хотели сделать что-то конкретное для типов значений? Более конкретно, что, если бы разработчики CLR сделали (в частности, они хотели получить GetHashCode для типов значений, которые связаны с эквивалентностью на основе значений, описанной выше, а не с эквивалентностью на основе идентичности, которую имеют объекты)?

Для этого у нас есть ValueType. Система рассматривает все типы значений как унаследованные от этого класса, который, в свою очередь, наследуется от Object. Enum, в свою очередь, наследуется от типа значения, а все типы enum наследуются от него, обеспечивая некоторые общие функции для всех перечислений.

Итак, если вы когда-нибудь захотите обработать суперкласс всех типов значений, используйте ValueType, но если вы действительно хотите создать тип значения, создайте структуру или перечисление в зависимости от ситуации.


Объяснение системы общих типов:

Структура - это тип значения, неявно производный от System.ValueType, который, в свою очередь, является производным от System.Object.Структура очень полезна для представления значений, требования к памяти которых невелики, и для передачи значений в качестве параметров по значению в методы, которые имеют строго типизированные параметры. В библиотеке классов .NET Framework все примитивные типы данных (Boolean, Byte, Char, DateTime, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 и UInt64) определены как структуры.

Подобно классам, структуры определяют как данные (поля структуры), так и операции, которые могут выполняться с этими данными (методы структуры). Это означает, что вы можете вызывать методы структур, включая виртуальные методы, определенные в классах System.Object и System.ValueType, а также любые методы, определенные в самом типе значения. Другими словами, структуры могут иметь поля, свойства и события, а также статические и нестатические методы. Вы можете создавать экземпляры структур, передавать их как параметры, сохранять как локальные переменные или сохранять их в поле другого типа значения или ссылочного типа. Структуры также могут реализовывать интерфейсы.

Типы значений также отличаются от классов в нескольких отношениях. Во-первых, хотя они неявно наследуются от System.ValueType, они не могут наследовать напрямую от любого типа. Точно так же все типы значений запечатаны, что означает, что никакой другой тип не может быть производным от них. Они также не требуют конструкторов.

Для каждого типа значения среда CLR предоставляет соответствующий упакованный тип, который является классом, имеющим такое же состояние и поведение, что и тип значения.Экземпляр типа значения помещается в рамку, когда он передается методу, который принимает параметр типа System.Object. Он распаковывается (то есть преобразуется из экземпляра класса обратно в экземпляр типа значения), когда управление возвращается из вызова метода, который принимает тип значения в качестве параметра по ссылке.Некоторые языки требуют использования специального синтаксиса, когда требуется тип в рамке; другие автоматически используют коробочный тип, когда это необходимо. Когда вы определяете тип значения, вы определяете как упакованный, так и неупакованный тип.

Странность ValueType заключается в том, что все вышеописанное может произойти.

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

Структуры - это типы значений. Типы значений особенные, потому что они размещаются в стеке, а не в куче. Чтобы «унаследовать» от ValueType, вы должны создать структуру.

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

C # не позволяет типам значений наследовать от других классов. Типы значений (структура) могут реализовывать интерфейсы.

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

Невозможность наследования из ValueType зависит от компилятора C #. Если мы посмотрим на управляемый код C ++:

value class Foo {};
value class Foo : System::ValueType {};

Оба они компилируются и идентичны. Конечно,

ref class Foo : System::ValueType {};

выдаст ошибку C3050: класс ref не может наследовать от System :: ValueType.
Не уверен, что позволяют другие компиляторы.

Если вы хотите наследовать от ValueType в C #, используйте структуру, а не класс, и компилятор позаботится об этом.

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

you cannot subclass ValueType directly. All value types derives from ValueType implicitly. Unlike with reference types, you cannot derive a new type from a value type. However, like reference types, structs can implement interfaces.

see MSDN to know more

1
ответ дан 27 November 2019 в 22:26
поделиться
  1. Класс расширяет 'System.Object', а структура расширяет 'System.ValueType'. Если бы вы могли сделать класс расширяющим 'System.ValueType', тогда не было бы смысла в ключевом слове 'struct'.

  2. Да

  3. Да. Для выполнения любой задачи должен быть только один способ. Как только появляется два способа сделать что-то, вы просто все усложняете. Общее правило.

0
ответ дан 27 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

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