View Full Version : [C#]Errore di assegnazione della variabile
Mattyfog
04-11-2008, 16:01
Ciao!!!
Eccomi ritornato! ;)
Non capisco perchè ho quest'errore direi abbastanza basilare...
ho creato 2 varibili di tipo string chiamate operazione e newoperazione.
Guardate questa pezzo di una funzione alla quale la varibile operazione è stata passata...
//questo pezzo di codice dovrebbe copiare la variabile operazione in new operazione
a=0;
string newoperazione;
while (true)
{
if (operazione[a] != '(' |
operazione[a] != ')' |
operazione[a] != '[' |
operazione[a] != ']' |
operazione[a] != '{' |
operazione[a] != '}' |
operazione[a] != '=')
{ break; }
newoperazione[a] = operazione[a];
a++;
}
ho il seguente errore:
Errore 1 Impossibile assegnare un valore alla proprietà o all'indicizzatore 'string.this[int]' perché è in sola lettura C:\Users\Matteo\C#\Calculator 4\Calculator 4\Form1.cs 107 17 Calculator 4
Perchè?
^TiGeRShArK^
04-11-2008, 18:10
non puoi modificare la stringa.
Per fare quello che vuoi dovresti usare la classe StingBuilder.
Mattyfog
04-11-2008, 20:32
che è sta classe? Comunque che non potessi modificare la stringa l'avevo capito solo mi chiedevo perchè e se quindi ci fosse un modo per poterla modificare senza ricorrere ad altre classi... Perchè comunque per le altre stringhe e variabili in generale tutto funzionava tranquillamente....
Quindi: perchè?
Grazie dell'aiuto
||ElChE||88
04-11-2008, 20:40
Perché usi il bitwise OR?
^TiGeRShArK^
04-11-2008, 20:50
che è sta classe? Comunque che non potessi modificare la stringa l'avevo capito solo mi chiedevo perchè e se quindi ci fosse un modo per poterla modificare senza ricorrere ad altre classi... Perchè comunque per le altre stringhe e variabili in generale tutto funzionava tranquillamente....
Quindi: perchè?
Grazie dell'aiuto
:mbe:
ma scusa hai mai programmato in C#? :mbe:
A string is a sequential collection of Unicode characters that is used to represent text. A String object is a sequential collection of System.Char objects that represent a string. The value of the String object is the content of the sequential collection, and that value is immutable.
A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification. If it is necessary to modify the actual contents of a string-like object, use the System.Text.StringBuilder class.
Quello che vuoi fare tu, ovvero "newoperazione[a] = operazione[a]" non è possibile.
Inoltre Elche ha giustamente notato che stai utilizzando il bitwise OR nelle condizioni dell'if al posto dell'OR normale....
Mattyfog
04-11-2008, 20:51
Perché usi il bitwise OR?
cioè?
^TiGeRShArK^
04-11-2008, 20:52
cioè?
cioè | al posto di ||
Mattyfog
04-11-2008, 20:53
scusate è che io è da poco che uso C# e prima usavo il c++ che mi influenza ancora parecchio non sapevo che le stringhe fossero read only....
E comunque cosa cambia in sto or?
^TiGeRShArK^
04-11-2008, 20:55
scusate è che io è da poco che uso C# e prima usavo il c++ che mi influenza ancora parecchio non sapevo che le stringhe fossero read only....
E comunque cosa cambia in sto or?
| lo devi utilizzare quando fai delle operazioni booleane sui byte, || lo devi utilizzare per tutti gli altri oggetti...
Mattyfog
04-11-2008, 21:05
perchè che cambia? io non ho mai avuto nessun problema...
^TiGeRShArK^
04-11-2008, 21:27
perchè che cambia? io non ho mai avuto nessun problema...
The operation
x || y
corresponds to the operation
x | y
except that if x is true, y is not evaluated (because the result of the OR operation is true no matter what the value of y might be). This is known as "short-circuit" evaluation.
Di solito è buona norma utilizzare gli operatori che utilizzano lo short-circuit, ovvero analizzano solo il primo operando e solo se necessario anche il secondo....
Mattyfog
04-11-2008, 21:32
boh non capisco :D :D
^TiGeRShArK^
04-11-2008, 21:54
boh non capisco :D :D
cosa non capisci? :mbe:
se A è true e la condizione è A | B devi comunque vedere anche il valore di B prima di proseguire, se invece la condizione è A || B puoi proseguire immediatamente senza conoscere anche il valore di B...
Anche se non ho ben capito ciò che vuoi ottenere con quel codice ( va sempre in break... o sbaglio ? ), nonostante la stringa sia un oggetto, metodi per "rigirarla" ce ne sono.
Prova questo e vedi se può andare :
newoperazione.Remove(a, 1).Insert(a, operazione.Substring(a, 1));
^TiGeRShArK^
04-11-2008, 22:04
Anche se non ho ben capito ciò che vuoi ottenere con quel codice ( va sempre in break... o sbaglio ? ), nonostante la stringa sia un oggetto, metodi per "rigirarla" ce ne sono.
Prova questo e vedi se può andare :
newoperazione.Remove(a, 1).Insert(a, operazione.Substring(a, 1));
si ma è decisamente + comodo lo StringBuilder :p
Mattyfog
04-11-2008, 22:06
ho usato un array char...
adesso invece ho appena aperto un'altra discussione... fatevi sentire!
si ma è decisamente + comodo lo StringBuilder :p
Cioè ? Come sarebbe quello che ho scritto io con lo StringBuilder ?
ho usato un array char...
Superfluo, ma se funziona... :)
^TiGeRShArK^
05-11-2008, 12:39
Cioè ? Come sarebbe quello che ho scritto io con lo StringBuilder ?
Con StringBuilder poteva accedere direttamente all'array di char circostante e non avrebbe creato 3 nuove stringhe ad ogni iterazione del ciclo :p
Su un ciclo da 1 milione di iterazioni ti saresti trovato con 3 milioni di stringhe assolutamente inutili con conseguente utilizzo di memoria e occupazione del processore :p
Con StringBuilder poteva accedere direttamente all'array di char circostante e non avrebbe creato 3 nuove stringhe ad ogni iterazione del ciclo :p
Su un ciclo da 1 milione di iterazioni ti saresti trovato con 3 milioni di stringhe assolutamente inutili con conseguente utilizzo di memoria e occupazione del processore :p
Insomma non vuoi proprio postarlo sto codice che con StringBuilder fa quello che avevo scritto... :D
io farei cosi' (o simili, non ho capito bene l'esempio)
string input = "qweriffi4465go(dofkl";
string delimiters = "(){}[]=";
int tocut = input.IndexOfAny(delimiters.ToCharArray());
string output = input.Substring(0, tocut);
Se la cosa e' estemporanea.
Se invece si tratta di fare piu' cose o meccanismi piu' complessi userei una RegEx.
^TiGeRShArK^
05-11-2008, 19:42
Insomma non vuoi proprio postarlo sto codice che con StringBuilder fa quello che avevo scritto... :D
l'avevo postato stamattina ma me l'aveva cancellata la manutenzione del forum e mi rompevo le bolls riscriverla :muro:
char[] chars = operazione.Chars;
char[] newChars = newoperazione.Chars;
newChars[a] = chars[a];
Ovviamente con operazione e newoperazione che sono due StringBuilder...
StringBuilder operazione = new StringBuilder();
StringBuilder newoperazione = new StringBuilder();
char[] chars = operazione.Chars;
char[] newChars = newoperazione.Chars;
newChars[a] = chars[a];
Quindi così ? Non mi risulta che StringBuilder abbia alcuna proprietà/metodo .Chars...
banryu79
06-11-2008, 14:27
StringBuilder operazione = new StringBuilder();
StringBuilder newoperazione = new StringBuilder();
char[] chars = operazione.Chars;
char[] newChars = newoperazione.Chars;
newChars[a] = chars[a];
Quindi così ? Non mi risulta che StringBuilder abbia alcuna proprietà/metodo .Chars...
Vabbè, forse si è confuso con il metodo .ToCharArray()
Vabbè, forse si è confuso con il metodo .ToCharArray()
Mi duole sembrare pignolo, ma... StringBuilder non c'ha manco il .ToCharArray()...
E mo' come la mettiamo ? :D
banryu79
06-11-2008, 14:43
Mi duole sembrare pignolo, ma... StringBuilder non c'ha manco il .ToCharArray()...
E mo' come la mettiamo ? :D
E c'hai ragione, mi sono confuso anch'io... Vabbuò, io me la batto :ops:
^TiGeRShArK^
06-11-2008, 15:08
StringBuilder operazione = new StringBuilder();
StringBuilder newoperazione = new StringBuilder();
char[] chars = operazione.Chars;
char[] newChars = newoperazione.Chars;
newChars[a] = chars[a];
Quindi così ? Non mi risulta che StringBuilder abbia alcuna proprietà/metodo .Chars...
No, sbagli.
StringBuilder ha una property pubblica che si chiama Chars.
Non mi ero semplicemente accorto che era un'indexed property e quindi il codice in realtà diventa il ben + semplice:
StringBuilder operazione = new StringBuilder("ciao");
StringBuilder newoperazione = new StringBuilder("baia");
newoperazione[0] = operazione[0];
StringBuilder operazione = new StringBuilder("ciao");
StringBuilder newoperazione = new StringBuilder("baia");
newoperazione[0] = operazione[0];
Questo compila e funziona. Finalmente. :D
In VB NET invece .Chars è utilizzabile ( fa parte di quei metodi e/o proprietà che per qualche motivo, francamente oscuro, non sono accessibili in C# ? ):
Dim operazione As New System.Text.StringBuilder("ciao")
Dim newoperazione As New System.Text.StringBuilder("baia")
'modo 1
newoperazione(0) = operazione(0)
'modo 2
newoperazione.Chars(0) = operazione.Chars(0)
MsgBox(newoperazione.ToString)
^TiGeRShArK^
06-11-2008, 15:52
Questo compila e funziona. Finalmente. :D
In VB NET invece .Chars è utilizzabile ( fa parte di quei metodi e/o proprietà che per qualche motivo, francamente oscuro, non sono accessibili in C# ? ):
Dim operazione As New System.Text.StringBuilder("ciao")
Dim newoperazione As New System.Text.StringBuilder("baia")
'modo 1
newoperazione(0) = operazione(0)
'modo 2
newoperazione.Chars(0) = operazione.Chars(0)
MsgBox(newoperazione.ToString)
no, semplicemente in C# le indexed properties vengono automaticamente tradotte con l'operatore [] mi sa :p
Infatti io leggendo la documentazione inizialmente non mi ero accorto che fosse una indexed property e davo per scontato che si usava chiamando a.Chars... :fagiano:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.