Permalänk
Medlem

C# Egenskaper och Metod

Hej. Jag har ett lite konstigt problem, säkert helt uppenbart, men jag ser det inte.

Jag har en klass som heter Crypto som ska kryptera/dekryptera en textsträng och returnera värdet.

Det funkar att göra såhär(men är inte praktiskt att göra på tiotalet textboxar):

private void save_Click(object sender, EventArgs e) { Crypto c = new Crypto(); c.Encrypt = textBox1.Text; //Klarext Settings.Default._textbox1setting = c.Encrypt; //krypterad text }

Såhär skulle jag villja ha av praktiska skäl(inte lika mycket kod när det ska tillämpas på flera textboxar):

public void Enc(string input, string output) { Crypto c = new Crypto(); c.Encrypt = input; output = c.Encrypt: } private void save_Click(object sender, EventArgs e) { Enc(textBox1.text, Settings.Default._textbox1setting); }

Varför funkar inte min metod?

Visa signatur

ASUS X99 Deluxe II | Intel i7 6850K 3.6 GHz | 2 x GTX 1080 Strix | 4 x Corsair 8 GB DDR4 3000 MHz CL15 Vengeance | Samsung 850 Evo 500 GB | OCZ Vertex 4 128 GB | Western Digital 2 TB

Permalänk
Medlem
Skrivet av xenopsy:

Hej. Jag har ett lite konstigt problem, säkert helt uppenbart, men jag ser det inte.

Jag har en klass som heter Crypto som ska kryptera/dekryptera en textsträng och returnera värdet.

Det funkar att göra såhär(men är inte praktiskt att göra på tiotalet textboxar):

Crypto c = new Crypto(); c.Encrypt = textbox1.Text; //Klarext Settings.Default._textbox1setting = c.Encrypt; //krypterad text

Såhär skulle jag villja ha av praktiska skäl(inte lika mycket kod när det ska tillämpas på flera textboxar):

public void Enc(string input, string output) { Crypto c = new Crypto(); c.Encrypt = input; output = c.Encrypt: }

Varför funkar inte min metod?

Antingen får du använda nyckelordet "out" för argumentet output eller så får du ha string som returtyp för metoden (och bara ett argument) och använda return c.Encrypt istället.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Antingen får du använda nyckelordet "out" för argumentet output eller så får du ha string som returtyp för metoden (och bara ett argument) och använda return c.Encrypt istället.

Går väl alldeles utmärkt att ha flertalet parameter på metod som returnerar en string?

Till TS, gör Crypto static med en metod (varför egenskap?) som returnerar den krypterade strängen.

Permalänk
Medlem
Skrivet av Hubbee:

Går väl alldeles utmärkt att ha flertalet parameter på metod som returnerar en string?

Till TS, gör Enc static med en metod (varför egenskap?) som returnerar den krypterade strängen.

Jag förstår inte vad du menar. Jag poänterade bara att om han gör som han gör nu behöver han använda "out", alternativt så returnerar han värdet istället (och då behöver han bara det ena argumentet).

Edit: Såg nu att TS redigerat frågan... Det kommer ju inte att fungera att få en property-setter att köras på det viset.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

public string EncryptString(string input) { Crypto c = new Crypto(); c.Encrypt = input; return c.Encrypt: }

Men, jag skulle inte haft Crypto som en klass med properties, jag skulle ju haft metoder i den.

Crypto c = new Crypto(); string output = c.Encrypt(input); return output;

Eller så skulle jag initierat Crypto "globalt" och sen bara i settern för textboxen göra textbox.Text = c.Decrypt(output).

Man kan ju göra det med en property som du gjort nu, med olika getters och setters, men gör det med metoder istället, det är mycket läsbarare.

Permalänk
Medlem

Eftersom det verkar råda stor förvirring, detta är rent konkret de två alterntiv jag nämnde:

private void save_Click(object sender, EventArgs e) { string res; Enc(textBox1.text, out res); Settings.Default._textbox1setting = res; } public void Enc(string input, out string output) { Crypto c = new Crypto(); c.Encrypt = input; output = c.Encrypt: }

private void save_Click(object sender, EventArgs e) { Settings.Default._textbox1setting = Enc(textBox1.text); } public string Enc(string input) { Crypto c = new Crypto(); c.Encrypt = input; return c.Encrypt: }

(Att jag öht nämner det första alternativet är att det såg ut som att det var detta TS försökte göra)

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av Ernesto:

public string EncryptString(string input) { Crypto c = new Crypto(); c.Encrypt = input; return c.Encrypt: }

Men, jag skulle inte haft Crypto som en klass med properties, jag skulle ju haft metoder i den.

Crypto c = new Crypto(); string output = c.Encrypt(input); return output;

Eller så skulle jag initierat Crypto "globalt" och sen bara i settern för textboxen göra textbox.Text = c.Decrypt(output).

Man kan ju göra det med en property som du gjort nu, med olika getters och setters, men gör det med metoder istället, det är mycket läsbarare.

Absolut, Crypto-klassen framstår som lite underlig...

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Jag hade valt evil penguin första alternativ.

Ett annat alternativ är att bygga en string extension så att alla strängar får en inbyggd metod att encrypt/decrypt.

Visa signatur

CPU : AMD Ryzen 5 5600X Moderkort : ASUS ROG Strix B550-F GAMING Grafikkort :EVGA GeForce GTX 1080 Ti FTW3 iCX Gaming HDMI 3xDP 11GBMinne : Corsair 16GB Chassi :Fractal Design Define 7 Compact Nätdel : Corsair RM750x Skärm #1 : Asus VG349Q Ultrawide Skärm #2 : Acer X34 Ultrawide

Permalänk
Medlem

(Om det inte är någon property inblandad där i alt. 1 så kan du förstås skippa "res" som mellansteg, insåg att jag antog väl mycket bara pga allt snack om properties)

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

private void save_Click(object sender, EventArgs e) { Settings.Default._textbox1setting = Enc(textBox1.text); } public string Enc(string input) { Crypto c = new Crypto(); c.Encrypt = input; return c.Encrypt: }

(Att jag öht nämner det första alternativet är att det såg ut som att det var detta TS försökte göra)

Tack så mycket. Det sista alternativet med public string var perfekt.

Bör väl tilläggas att jag är relativt ny inom programmering...

Tack än en gång för hjälpen.

Visa signatur

ASUS X99 Deluxe II | Intel i7 6850K 3.6 GHz | 2 x GTX 1080 Strix | 4 x Corsair 8 GB DDR4 3000 MHz CL15 Vengeance | Samsung 850 Evo 500 GB | OCZ Vertex 4 128 GB | Western Digital 2 TB