Технически это неправильная практика для вызова конструкторов или деструкторов явно.
Ключевое слово delete в конечном итоге вызывает их при его использовании. То же самое касается новых конструкторов.
Извините, но этот код заставляет меня хотеть вырвать мои волосы. Вы должны делать это следующим образом:
AnObject* anObject = new AnObject();
delete anObject;
НИКОГДА не делать это:
anObject->~AnObject(); // My step 1.
free(anObject)
Если вы должны «сбросить» объект, либо создайте метод, который очищает все переменные экземпляра внутри, или то, что я бы рекомендовал вам сделать, это удалить объект и выделить себе новый .
«Это ядро языка?»
blockquote>Это ничего не значит. Perl имеет около шести способов записи цикла for. Просто потому, что вы можете делать что-то на языке, потому что они поддерживаются, значит, вы должны их использовать. Черт, я мог бы написать весь мой код, используя для операторов switch, потому что «Core» языка поддерживает их. Не делает это хорошей идеей.
Почему вы используете malloc, когда вам явно не нужно. Malloc - это метод С.
Новые и Удалить ваши друзья в C ++
«Сброс» объекта
myObject.Reset();
Там вы идете. Таким образом, вы избавляетесь от ненужного выделения и освобождения памяти опасным образом. Напишите метод Reset (), чтобы очистить значение всех объектов внутри вашего класса.
Ваша проблема - это объект, который вы пытаетесь связать. Вам нужно использовать GridLength
Например
GridLength test = new GridLength(3, GridUnitType.Star); // which is "3*"
Просто обновите вашу ViewModel, чтобы получить значение типа GridLength
Эта ошибка связана с тем, что вы связываете строку с шириной, для которой требуется другой объект.
Чтобы исправить это, одним из решений будет использование Converter
, которое преобразует ваш тип (тот, который идет из ViewModel) в тип, ожидаемый для ширины сетки. Подробнее о конвертерах здесь
Конвертер, который вам нужен, будет выглядеть следующим образом:
public class IntToGridLengthConverter : IValueConverter
{
public IntToGridLengthConverter()
{
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var intValue = System.Convert.ToInt32(value);
return new GridLength(intValue, GridUnitType.Star);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Тогда в XAML вам просто нужно его использовать.
Добавление нового раздела в XAML и вызов конвертера
<ContentPage.Resources>
<ResourceDictionary>
<local:IntToGridLengthConverter x:Key="gridLengthConverter" />
</ResourceDictionary>
</ContentPage.Resources>
Затем использование конвертера в ваших привязках
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding firstColValue, Converter={StaticResource gridLengthConverter}}" />
<ColumnDefinition Width="{Binding secondColValue, Converter={StaticResource gridLengthConverter}}"/>
</Grid.ColumnDefinitions>
Как вы можете видеть, я использую Ключ , который был установлен в предыдущей части.
Одним небольшим изменением, которое вам нужно сделать в свойствах ViewModel, является то, что теперь они должны иметь тип int
(целое число). Таким образом, в вашей ViewModel вы должны установить только целую часть значения, которое вы хотите установить, например:
firstColValue = 7;
secondColValue = 3;
Работа по преобразованию этих значений в 7*
и 3*
соответственно будет отвечать за Преобразователь .
Использование конвертеров не позволит вам использовать элементы Xamarin.Forms в ваших моделях представления, так как они должны быть независимыми. Также этот конвертер можно повторно использовать на любой другой странице, которая вам нужна.
Надеюсь, это поможет .-