C #, копировать один bool в другой (ref, а не val)

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

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

13
задан Julien Christin 10 December 2013 в 19:52
поделиться

3 ответа

это может быть не то, что вы хотите, но если ваш сценарий таков, что вам нужна функция, которую вы вызываете для изменения вашего локального логического значения, вы можете использовать ref или out keyworkd.

bool a = false;

F(ref a);
// a now equals true

...

void F(ref bool x)
{
x = true;
}
2
ответ дан 1 December 2019 в 06:08
поделиться

Нет. Поскольку bool является типом значения, он всегда будет копироваться по значению.

Лучший вариант - заключить bool в класс - это даст ему семантику ссылочного типа:

public class BoolWrapper
{
     public bool Value { get; set; }
     public BoolWrapper (bool value) { this.Value = value; }
}

BoolWrapper a = new BoolWrapper(false);
BoolWrapper b = a;
b.Value = true; 
 // a.Value == true 
33
ответ дан 1 December 2019 в 06:08
поделиться

A bool is a value type and cannot be copied by reference.

0
ответ дан 1 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

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