PDA

View Full Version : سوال در مورد متغیر سراسری



skh1300
دوشنبه 05 دی 1390, 20:54 عصر
دوستان سلام من تازه کارم
من قبلا تو ویژوال بیسیک یه متغییر تو ماژول از نوع Public تعریف میکردم و توی تمام کلاسها و فرم ها استفاده میکردم اما توی سی شارپ ماژول ندیدم (شاید من بلد نیستم)این کار رو تو سی شارپ باید چگونه انجام بدم

sayvan
دوشنبه 05 دی 1390, 21:10 عصر
هر متغییر رو بیرون از تابع تعریف کنی در اون فرم به شکل عمومی و میتونی تو همه ی رویداده ا و تابعات ازش استفاده کنی

public Form1()
{

InitializeComponent();
}
string s;//jمثلاً در اینجا

Amin_Kamalinia
دوشنبه 05 دی 1390, 21:18 عصر
با سلام
دقت کنید در سی شارپ ما از کلاسها object می سازیم و به وسیله ی این object می توانیم به عناصر public آن کلاس دسترسی پیدا کنیم مانند:

form1 f=new form1();
f.show();
ولی اگر ما همه چیز را public تعریف کنیم مفهوم oop از بین می رود وحتی در کار های گروهی به مشکلات بزرگی می رسیم و امنیت نرم افزار زیر سوال می رود
برای این کار بهتر است آن مقدار را بفرستیم به method مورد نظر مانند:
method مورد نظر :

public void test_method(int x);

طریقه ی فراخوانی:
f.test_method(20);
که به عدد 20 Parameter و به argument ، intx می گوییم.

skh1300
دوشنبه 05 دی 1390, 21:34 عصر
هر متغییر رو بیرون از تابع تعریف کنی در اون فرم به شکل عمومی و میتونی تو همه ی رویداده ا و تابعات ازش استفاده کنی

public Form1()
{

InitializeComponent();
}
string s;//jمثلاً در اینجا
فکر کنم منظورم متوجه نشدی دوست عزیز من میخوام یه متغییر تعریف کنم که توی تمامی فرم ها ازش استفاده کنم مثلا یه متغییر یه جا تعریف کنم توی تمامی فرم ها بتونم هم مقدار بهش بدم هم بخونم

mmd2009
دوشنبه 05 دی 1390, 21:43 عصر
با سلام

ماژول ( Module ) در vb6 مطرح شد و پس از گسترش vb6 به vb.Net واسه اینکه از حالت oop استفاده بشه قصد داشتند که ماژوال که تمام استاتیک بود رو حذف بکنند ولی به دلیل اینکه این کار شاید باعث عدم کارایی و حتی مهاجرت vb6 کاران به vb.net میشد به همین منظور اون رو تو vb.Net هم منتقل کردن ولی در کل یک برنامه نویس oop از ماژول استفاده نمیکنه. در مفهموم oop ما از هر چیزی که میخوایید استفاده کنید یک شی میسازیم و برای هم شی متد ها یا پروپریتی هایی یا .. توضیح دیگه که میتونید مراجعه کنید به مطالب مفهموی oop که تو این انجمن این نوع مطالب هم کم نیستن



فکر کنم منظورم متوجه نشدی دوست عزیز من میخوام یه متغییر تعریف کنم که توی تمامی فرم ها ازش استفاده کنم مثلا یه متغییر یه جا تعریف کنم توی تمامی فرم ها بتونم هم مقدار بهش بدم هم بخونم


شما میتونید به این صورت عمل کنید :


public class MyClass
{
public string MyName{get;set;}
}


و به این صورت فراخوانی کنید :


MyClass _MyClass=new MyClass()

_MyClass.MyName //TODO


موفق باشید

skh1300
دوشنبه 05 دی 1390, 21:44 عصر
با سلام
دقت کنید در سی شارپ ما از کلاسها object می سازیم و به وسیله ی این object می توانیم به عناصر public آن کلاس دسترسی پیدا کنیم مانند:

form1 f=new form1();
f.show();
ولی اگر ما همه چیز را public تعریف کنیم مفهوم oop از بین می رود وحتی در کار های گروهی به مشکلات بزرگی می رسیم و امنیت نرم افزار زیر سوال می رود
برای این کار بهتر است آن مقدار را بفرستیم به method مورد نظر مانند:
method مورد نظر :

public void test_method(int x);

طریقه ی فراخوانی:
f.test_method(20);
که به عدد 20 Parameter و به argument ، intx می گوییم.
تشکر از پاسختون
یعنی اگه بخوام متغییری تعریف کنم که بتونم توی تمام فرمها ازش استفاده کنم ابتدا باید توی کلاس متغییرهای Public تعریف کنم و بعد اونا رو ببرم داخل متد و بر اساس پارامتر بهشون مقدار بدم برای خواندن از متغییر ها یکی یکی از متد همون کلاس بخونم؟آره؟

sayvan
دوشنبه 05 دی 1390, 21:57 عصر
برای متغییر هایی که گفتی میخوای تو کل برنامه است استفاده کنی اونا رو در یک کلاس و به صورت پابلیک و استاتیک تعریف میکنی
بعدش از اونا متغییرات با استفاده از
نام متغییر . نام کلاس
میتونی تو کل برنامه ات از اون متغییرات استفاده کنی
وقتی که کلاست رو ایجاد کردی متغییرات رو مانند مثال به صورت زیر تعریف میکنی

Public static string name;
Public static int code;

بعدش تو هر کدوم از فرمات میتونی با استفاده از کد زیر استفاده کنی(نام کلاست مثلاً myclass)

myclass.name="reza";

Amin_Kamalinia
دوشنبه 05 دی 1390, 22:37 عصر
تشکر از پاسختون
یعنی اگه بخوام متغییری تعریف کنم که بتونم توی تمام فرمها ازش استفاده کنم ابتدا باید توی کلاس متغییرهای Public تعریف کنم و بعد اونا رو ببرم داخل متد و بر اساس پارامتر بهشون مقدار بدم برای خواندن از متغییر ها یکی یکی از متد همون کلاس بخونم؟آره؟

نه فکر کنم اشتباه متوجه شدین به این مثال دقت کنید:

class Class_text
{
private int a;
protected int c;
public void tm1(int b)
{
}
private void tm2()
{
}
protected void tm3(float d)
{
}
}

این کلاس رو فرض کنیم ما بعضی چیز هایی هستند که نمی خواهیم افراد دیگری به آنها دسترسی پیدا کنند به این دلیل آنها را Private تعریف می کنیم بعد از این که از این کلاس object ساختین آنگاه بهد از زدن . یا dot شما نمی توانید private ها و protected ها را ببینید
protected را زمانی می توان دید که از آن کلاس به ارث برد مثلا

class Class1:Class_text
{
private void m()
{
base.tm3(10.1f);
}
}

در واقع protected برای فرزندان مانند public ، class1 و برای غریبه ها private می باشد

haniyehghassami
دوشنبه 05 دی 1390, 22:48 عصر
فکر کنم منظورم متوجه نشدی دوست عزیز من میخوام یه متغییر تعریف کنم که توی تمامی فرم ها ازش استفاده کنم مثلا یه متغییر یه جا تعریف کنم توی تمامی فرم ها بتونم هم مقدار بهش بدم هم بخونم

سلام
متغیر های که این جوری می خواین باشه به نظرم به 2 حالته زیر میشه :

1 میشه استاتیک تعریف کرد که همه جای برنامه هر مقداری بهش بدی همون را به صورت ثابت نگهداری میکنه

toye class morede nazareton benvisin ino
public class1{
public static bool propertice1;

{

// badesh har ja khastin behesh injuri meghdar bedin
class1.propertice1=false;


2 میشه به صورت خصوصیت تعریف کرد که میتونین پست و منو این جا (http://barnamenevis.org/showthread.php?313524-%D8%B3%D9%88%D8%A7%D9%84-%D9%88-%D8%AC%D9%88%D8%A7%D8%A8-%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AB%D8%A8%D8%AA-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%D8%A7%D8%AA/page9) بخونین واسه توضیحات بیشتر


public class1
{
inja yeki benvis masalan :
private bool PROPERTICE1;
public bool propertice1
}
set{}
PROPERTICE1 ;get{return }
}
}


//واسه ی صدا زدن این نوع ها باید این جور نوشت
class1 cl = new class1();
cl.prpoertice1=true;

majidrezaei2007
دوشنبه 05 دی 1390, 22:54 عصر
اگه می خواین همه جا دسترسی داشته باشین همین static تنها راه حلشه

rahmatr
سه شنبه 06 دی 1390, 12:48 عصر
دوستان سلام من تازه کارم
من قبلا تو ویژوال بیسیک یه متغییر تو ماژول از نوع Public تعریف میکردم و توی تمام کلاسها و فرم ها استفاده میکردم اما توی سی شارپ ماژول ندیدم (شاید من بلد نیستم)این کار رو تو سی شارپ باید چگونه انجام بدم

کسی می تواند شما را درک کند که خودش قبلا vb.net کار کرده باشد.
در vb.net تعریف ماژول اینگونه است:
Module Module1
Public ProjectName As String = "test"

End Module

در نمونه بالا متغییری به نام ProjectName تعریف شده که در هر کلاسی به اون دسترسی داریم. حتی می توانیم اسم ماژول را هم ذکر نکنیم:
Public Class Form1

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Me.Text = ProjectName

Me.Text = Module1.ProjectName
End Sub
End Class



اما در سی شارپ ماژول نداریم. برای این کار متغییرهای که به این صورت لازم داریم را به صورت static در کلاسهای مربوطه تعریف می کنیم.
مثلا می توانید کلاسی به اسم Setting داشته باشید و تمام این متغییرها را اونجا تعریف کنید:
public class Setting
{
public static string ProjectName = "test";
}


حتی می توانید متدهای static هم داشته باشید. اینجا اما برای دسترسی به متغییرها لازم است که اسم کلاس را هم ذکر کنیم:
private void Form1_Load(object sender, EventArgs e)
{
this.Text = Setting.ProjectName;
}


اگر متغییر را به صورت static تعریف نمی کردیم باید یک نمونه از کلاس Setting می ساختیم:
Setting mySetting = new Setting();
this.Text = mySetting.ProjectName;