Объект класса имеет то преимущество, что можно передать ссылку на него, при этом объем и время жизни такой ссылки не ограничены, если она достигает внешнего кода. Преимущество структуры состоит в том, что, хотя можно передавать недолговечные ссылки на них, невозможно передавать бесконечные беспорядочные ссылки. Это помогает избежать необходимости беспокоиться о том, существуют ли такие ссылки.
Некоторые люди предположили, что владельцы данных, которые являются изменяемыми, не должны быть структурами. Я категорически не согласен. Сущности, которые существуют для хранения данных, во многих случаях должны быть структурами, особенно если они изменяемы. Эрик Липперт неоднократно публиковал, что он считает изменчивые типы значений злыми (поиск по меткам «изменчивый» и «struct»). Конечно, верно, что .net позволяет делать определенные вещи с помощью изменяемых структур, которые он не должен, и не позволяет удобно некоторым вещам, которые он должен, но структурам POD («Обычные старые данные»), которые не имеют мутирующих методов, но вместо этого выставляют все свое состояние через общедоступные поля, имеют очень полезную согласованность в своем поведении, которое не используется ни с каким другим типом данных. Использование структуры POD может смутить кого-то, кто не знаком с тем, как они работают, но сделает программу более читаемой для всех, кто это делает.
Рассмотрим, например, следующий код, если EmployeeInfoStruct не содержит ничего но типы значений и неизменные типы классов, такие как String:
[employeeInfoStruct is a struct containing the following field] public Decimal YearlyBonus; [someEmployeeContainer is an instance of a class which includes the following method] EmployeeInfoStruct GetEmployeeInfo(String id); // Just the signature--code is immaterial [some other method uses the following code] EmployeeInfoStruct anEmployee = someEmployeeContainer.GetEmployeeInfo("123-45-6789"); anEmployee.YearlyBonus += 100;
Эрик Липперт жалуется, что вышеуказанный код изменит значение в anEmployee, но это изменение не повлияет на контейнер. Я бы предположил, что это хорошо - любой, кто знает, как работают структуры, может смотреть на вышеуказанный код и знать, что запись в структурную переменную затронет эту переменную, но не повлияет ни на что другое, если программа позже не использует какой-либо другой метод (возможно, SetEmployeeInfo), чтобы сохранить эту переменную где-то.
Теперь замените EmployeeInfoStruct на EmployeeInfoClass, который имеет свойство read / write типа YearlyBonus. Используя только вышеприведенную информацию, что можно сказать о взаимосвязи между написанием для какого-либо рабочего сервера и anEmployee? В зависимости от реализации класса anEmployee (который, за исключением случаев, когда EmployeeInfoClass запечатан, может быть или не быть фактически EmployeeInfoClass) и someEmployeeContainer, отношения между объектами могут быть любыми. Можно записать:
С structs, содержащим только поля любых типов значений или неизменяемых классов, семантика всегда будет # 1. Не нужно смотреть на код самой структуры или код контейнера, чтобы знать это. В отличие от этого, если anEmployee.Salary или someEmployeeContainer.GetEmployee является виртуальным, невозможно понять, что такое семантика.
Важно отметить, что если структуры большие, передача их по значению или возврату они от функций могут быть дорогими. Обычно лучше передавать большие структуры как ref
параметры, когда это возможно. Хотя встроенные коллекции действительно не делают хорошую работу по облегчению такого использования, он может сделать использование структуры сотен байтов дешевле, чем использование класса.
Вот ваша проблема:
new Color(0f, 0f, 0f, **255f**);
Параметр конструктора Color
принимает значения от 0f
до 1f
, но вы передаете 0f
в 255f
.
Это должно быть:
colorToFadeTo = new Color(0f, 0f, 0f, 1f);
Если вы хотите использовать диапазон 0
- 255
, вы должны разделить его 255
.
colorToFadeTo = new Color(0f, 0f, 0f, 255f/255f);
Также есть Color32
, который может принимать значения между 0
и 255
. Вы можете использовать это, а затем скрывать его до цвета.
Color32 color32 = new Color32(0f, 0f, 0f, 255f));
Color color = color32;
0f
до1f
. Посмотрите на все статические переменные в этой ссылке. Они используют0
для1
. Ни один из них не использует255
или что-либо выше1
. Если он меняется так быстро, передайтеfalse
в параметрignoreTimeScale
.screen.CrossFadeColor(colorToFadeTo, fadeTime, false, true);
– Programmer 19 February 2017 в 16:261f
. Просто говоря, что единство не ведет себя иначе, когда я чередую между1f
и255f
. Они работают или не работают, хотя, очевидно, не так, как я хочу их. В конце я исправил проблему, поставив изображениеa
на 1 из 255. Я не знаю, почему это работает, но начиная с 0 нет, но он работает, тем не менее. Я не сомневаюсь в вашем ответе, и я знаю, что вы говорите, это полная истина, просто говоря, что это не одна вещь, вызывающая эту проблему. – RnRoger 19 February 2017 в 17:03