Tema: Re: C# pasiekt objekta is kitos formos
Autorius: Jornada Del Muerto
Data: 2012-08-10 17:26:04
ref ar out reik paprastai jei nori grazint reiksme i kazkoki kintamaji, galima sakyt nurodai reference reference'a, pvz.

int a;
int.TryParse("111", out a); << -- jei viskas bus ok a kintamajam bus priskirta atitinkama reiksme

O siaip bet kokius objektus bet kam atiduodant realiai zemame lygyje eis tik pointeris i ji, del to gali daryt kazka tokio:


void MetodasA ()
{
    DataTable t = new DataTable();

    // colz
    AddColumn("id");
    AddColumn("name");
    
    // rowz
    AddRow(t, "Jonas");
    AddRow(t, "Antanas");
    AddRow(t, "Petras");

    Debug.Print(t.Rows.Count);

}

void AddColumn (DataTable table, string name){
    table.Columns.Add(name);
}

void AddRow (DataTable table, string name){
    DataRow r = table.NewRow();
    r["id"] = table.Rows.Count;
    r["name"] = name;

    table.Rows.Add(r);
}

Ir skirtumo nebus ar tai bus kitas tos pacios klases metodas, ar kitos klases metodas ar konstruktorius.

P.S. 

Tiesa viena karta vieno studento kode buvo labai idomus bugas, kiek gal susijas su sia tema. 

    Jeigu gerai pamenu jis kure System.Net.Sockets.NetworkStream objekta, kuris inicializuojamas dar per kazkokia klase ar kelias vienoje iskviestoje klaseje, o ant galo grazindavo tik si NetworkStream objekta, o visus kitus inicializacijai reikalingus objektus palikdavo po inicializacijos jau nereikalingoje klaseje, kuria paprasciausiai sunaikindavo Garbage Collector ir jo programa, kuri atlikdavo duomenu apsikeitima turejo toki buga, kad pradejus apsikeitima jei duomenu paketas nedidelis (zodziu jei neilgai uztrunka ju perdavimas) tai viskas suveikia graziai, o jei duomenu daugiau tai viskas luzdavo :D is pradziu atrode, kad del duomenu dydzio, kol neisigilinau i problema.

    Paprasciausiai Garbage Collector sunaukindavo keliu sekundziu begyje visus nereikalingus objektus, ten tokius kaip NetworkConnection ar kazkas panasaus :) ir jo tas Stream budavo tuo paciu uzdaromas. Tiesiog visu kitu NetworkStream inicializacijos metu reikalingu objektu jis niekur nesaugojo, GC mane, kad jie nereikalingi.

    Tai paprasciausiai pakako visus inicializacijos metu naudojamus objektus sugrust i viena duomenu klase, kuri grazinama ir bugas buvo istaisytas, kol objektai referencinami ir naudojami ju GC nenaikina.

JDM.



"Jornada Del Muerto" <jornada@lythum.lt> wrote in message news:k034sj$tra$1@trimpas.omnitel.net...
> C# automatu tik objektu pointeriai perduodami.
> 
> "dfdf" <dfdf@dfdf.df> wrote in message news:k02rvs$jaa$1@trimpas.omnitel.net...
>> nereikia, nebent naudoji paprastus tipus (int, string ir pan), nes 
>> perduodama pointeris o ne klonuojama pats objektas
>> 
>> "ravikas" <rrr@af.asdgd> wrote in message 
>> news:op.witk0bx9kwsgap@ramunas-pc.fvs.local...
>>> + dar papildomai perduot 'ref' reikia, jei nori paimti kazka paskui
>>>
>>> public Form2(ref Class1 klase)
>>> {
>>>             InitializeComponent();
>>>             _klase = klase;
>>> }
>>>
>>> On Fri, 10 Aug 2012 12:48:46 +0300, dfdf <dfdf@dfdf.df> wrote:
>>>
>>>> vietoj
>>>> public Form1()
>>>>         {
>>>>             InitializeComponent();
>>>>             Class1 klase = new Class1();
>>>>         }
>>>>
>>>> turetu buti
>>>> public Form1()
>>>>         {
>>>>             InitializeComponent();
>>>>             klase = new Class1();
>>>>         }
>>>>
>>>> "Dziedukas" <dejau@gmail.com> wrote in message 
>>>> news:k02jrp$90p$1@trimpas.omnitel.net...
>>>>> ne,nu jau nervai nelaiko, kame beda???
>>>>> public partial class Form1 : Form        //pagrindine forma
>>>>>    {
>>>>>        public Form1()
>>>>>        {
>>>>>            InitializeComponent();
>>>>>            Class1 klase = new Class1();
>>>>>        }
>>>>>
>>>>>        private void button1_Click(object sender, EventArgs e)    //iki 
>>>>> sito dar net nedaeina        {
>>>>>            label1.Text = klase.vardas;
>>>>>        }
>>>>>
>>>>>        private void button2_Click(object sender, EventArgs e)
>>>>>        {
>>>>>            Form2 forma2 = new Form2(klase);
>>>>>
>>>>>            if (forma2.ShowDialog() == DialogResult.OK)
>>>>>            {
>>>>>
>>>>>            }
>>>>>        }
>>>>>        public Class1 klase { get; set; }
>>>>>    }
>>>>>
>>>>> antra forma
>>>>> public partial class Form2 : Form
>>>>>    {
>>>>>        Class1 _klase = new Class1();
>>>>>
>>>>>        public Form2(Class1 klase)
>>>>>        {
>>>>>            InitializeComponent();
>>>>>            _klase = klase;
>>>>>        }
>>>>>        private void button1_Click(object sender, EventArgs e)
>>>>>        {
>>>>>            _klase.vardas = textBox1.Text;        //----->va cia 
>>>>> pastringa atseit reikia panaudoto "new" ir t.t.
>>>>>            Close();
>>>>>        }
>>>>>    }
>>>>>
>>>>> klase
>>>>> public class Class1
>>>>>    {
>>>>>        public string vardas { set; get; }
>>>>>    }
>>>>>
>>>
>>>
>>> -- 
>>> Using Opera's revolutionary email client: http://www.opera.com/mail/ 
>>