گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
الزاما نه، در ضمن GMT درسته از که از نظر معنی و مفهوم معادل UTC نیست، ولی از نظر مقداری یکی هستند، UTC رو هم که با ToUniversalTime بدست میارید :
DateTime.ToUniversalTime Method (System)


نام رو برای اشاره در برای برنامه خودتون در نظر بگیرید و همراه ID اون backup در جایی ثبت کنید که یک GUID منحصر بفرد ئه.

سلامی مجدد
خیلی ممنون استاد علی
چرا گفتین الزاما نه؟
وقت کردین ، توی کامپیوتر خودتون بعدا تست میکنین که آیا آدرس بکاپ اش از فرمولی که گفتم ، پیروی میکنه یا نه؟
چون توی کامپیوتر من که از اون فرمول همه شون پیروی میکردن.
ببخشیدها
خیلی ممنون
 

SU-57

Active Member
سلام استاد علی
چند سوال دارم

1- فرض کنید یک آرایه ای از int داریم حالا در دستور foreach بهتره همون var بیاد یا int

کد:
foreach (var item in myArray)

foreach (int item in myArray)
2- در سی شارپ آرایه یک بعدی داریم دو بعدی داریم و الی آخر. پس آرایه دندانه دار رو چی باید بگیم مثلا برای هر کدوم از ارایه های زیر می شه نام بذاریم.

کد:
int[][] myJaggedArray;

int[][,] myJaggedArray;
مثلا در مورد اولی اگه بگیم دو بعد داره؛بعد اول و بعد دوم، پس با آرایه دو بعدی اشتباه می شه یا ممکنه همون فرض بشه.یا در مورد دومی بگیم کلا دو بعد داره و آرایه دومیش هم دو بعدیه

3- چون شما تجربه برنامه نویسی بسیار زیادی دارین در واقعیت برنامه نویسی کدوم آرایه ها رو باید یاد بگیریم و کدوما نیازی نیست. مثلا آرایه یک بعدی و دو بعدی و سه بعدی و در آرایه های دندانه دار این سه مورد زیر کافیه (به سطح علمی من نگاه نکنید هر کدوم نیازه لطفا بفرمایید تا من تمرین کنم)

کد:
int[][]

int[][][]

int[][,]
4- طبق اصول برنامه نویسی کدوم نوع نوشتن درست تره هر چند نتیجه یکی در بیاد

کد:
int[] myArray = { 10, 15 };

int[] myArray = new int[]{ 10, 15 };
5- اگه کد زیر بنویسم رشته C++ همچنان در حافظه هیپ وجود داره؟ چون string کلاسه اینو پرسیدم.

کد:
string string1 = "C++";

string1 = "C#";
6- به عکس زیر نگاه کنید اون علامت هایی که زدم درسته؟ (به عددها توجه نکنید برای راهنمایی گذاشته شده منظورم خود کروشه است)

vz3r_uu.jpg



7- دو تا سوال از گذشته: آیا جمله های زیر درست هستند

الف: یک dll یا 32 بیتیه یا 64 بیتی و نمی شه همزمان هم 32 بیتی باشه و هم 64 بیتی
ب: اگه anycpu رو انتخاب کنیم و در برنامه خودمون dll های 32 بیتی و 64 بیتی همزمان داشته باشیم اونایی که 32 بیتی هستن 32 بیتی اجرا میشن و اونایی که 64 بیت هستن 64 بیتی

8- بهترین متغیر برای نشان دادن کد اسکی یک کاراکتر چیه؟ منظورم اینه چون کد اسکی یک کاراکتر به عدد تبدیل می شه از short استفاده کنیم یا int

9- در جای خالی زیر چه کلمه ای باید بذاریم:

.NETFramewrok ماشین مجازی ... است. ( .NET یا ویندوز)

10- من مفهوم struct که مخفف structure هست رو درک نمی کنم. یعنی مایکروسافت یک اسم بی معنی براش انتخاب کرده یا این نام گذاری هدفمنده. این ساختار بودن رو درک نمی کنم که داخل کلاس قرار می گیره.

11- توی یک انجمن دیگه یک فردی یک سوالی پرسید و یک برنامه نویس مفهوم کلاس رو به این صورت توصیف کرد:

"کلاس یک مفهوم انتزاعیه" ...

"فرض کنید که یه روز در اتاق تون نشسته اید و یک مفهوم میاد در ذهن تون. این مفهوم استوانه ای سفالی رو توصیف می کنه که یک قاعده ی اون بسته و قاعده ی دیگر اون باز هستش و برای اون یک دسته در وجه جانبی در نظر گرفته شده. کاربرد این مفهوم می تونه نوشیدن مایعات باشه. شما نام این مفهوم Class رو می ذاریدو لیوان (mug). قاعدتا لیوان توصیف شده تا الان یک مفهوم بوده و تا زمانی که یک شی فیزیکی (object) از اون ساخته نشه، نمیشه ازش برای آشامیدن مایعات استفاده کرد."

می خوام بدونم این تعریف درسته چون در ویژوال استودیو ما داخل کلاس انواع کد ها رو می بینیم یا متغیر ها رو و شاید فقط یک چیز در ذهن ما نباشه.

مثلا ما می تونیم کلاس وسائل نقلیه داشته باشیم که شامل سواری و اتوبوس و هواپیما می شه که مثلا برای کلاس سواری می تونیم سمند و پراید رو داشته باشیم. حالا کلاس وسائل نقلیه، سواری، اتوبوس و هواپیما یک مفهوم هستند اما سمند و پراید هر کدوم یک شی هستند. اما در عین شی بودن می تونن یک کلاس هم باشن چون دارای اجزای مختلفی هستند هم دارای خواص و هم متد هستند. و کلا این بحث کلاس و شی در هم تنیده شده هستن و بعضی وقت ها آدم گیج می شه. چون اکثرا دیدم که دو نوع برداشت از سی شارپ دارن. یک عده میگن هر چی ما در سی شارپ بنویسیم فقط به صورت شی گرایی هست و به غیر از شی گرایی نمی تونیم طور دیگه ای بنویسیم. حتی مقدار یک متغیر رو شی می دونن. اما من چند وقت پیش یک پروژه ای دیدم که نوشته بود من یک برنامه در سی شارپ نوشتم و مثلا انقدر پول می دم یکی به صورت شی گرایی درش بیاره. آیا واقعا همینطوری که ما کدها رو می نویسم داریم روش شی گرایی رو به کار می بریم یا اینکه شی گرایی دارای یک ساختار درست و منظم و حرفه ایه که باید طبق اصولی رعایت بشه. اگه اینطور هست این ساختار رو به صورت کلی و تیتر وار نام ببرید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی
چند سوال دارم

1- فرض کنید یک آرایه ای از int داریم حالا در دستور foreach بهتره همون var بیاد یا int

کد:
foreach (var item in myArray)

foreach (int item in myArray)
2- در سی شارپ آرایه یک بعدی داریم دو بعدی داریم و الی آخر. پس آرایه دندانه دار رو چی باید بگیم مثلا برای هر کدوم از ارایه های زیر می شه نام بذاریم.

کد:
int[][] myJaggedArray;

int[][,] myJaggedArray;
مثلا در مورد اولی اگه بگیم دو بعد داره؛بعد اول و بعد دوم، پس با آرایه دو بعدی اشتباه می شه یا ممکنه همون فرض بشه.یا در مورد دومی بگیم کلا دو بعد داره و آرایه دومیش هم دو بعدیه

3- چون شما تجربه برنامه نویسی بسیار زیادی دارین در واقعیت برنامه نویسی کدوم آرایه ها رو باید یاد بگیریم و کدوما نیازی نیست. مثلا آرایه یک بعدی و دو بعدی و سه بعدی و در آرایه های دندانه دار این سه مورد زیر کافیه (به سطح علمی من نگاه نکنید هر کدوم نیازه لطفا بفرمایید تا من تمرین کنم)

کد:
int[][]

int[][][]

int[][,]
4- طبق اصول برنامه نویسی کدوم نوع نوشتن درست تره هر چند نتیجه یکی در بیاد

کد:
int[] myArray = { 10, 15 };

int[] myArray = new int[]{ 10, 15 };
5- اگه کد زیر بنویسم رشته C++ همچنان در حافظه هیپ وجود داره؟ چون string کلاسه اینو پرسیدم.

کد:
string string1 = "C++";

string1 = "C#";
6- به عکس زیر نگاه کنید اون علامت هایی که زدم درسته؟ (به عددها توجه نکنید برای راهنمایی گذاشته شده منظورم خود کروشه است)

vz3r_uu.jpg



7- دو تا سوال از گذشته: آیا جمله های زیر درست هستند

الف: یک dll یا 32 بیتیه یا 64 بیتی و نمی شه همزمان هم 32 بیتی باشه و هم 64 بیتی
ب: اگه anycpu رو انتخاب کنیم و در برنامه خودمون dll های 32 بیتی و 64 بیتی همزمان داشته باشیم اونایی که 32 بیتی هستن 32 بیتی اجرا میشن و اونایی که 64 بیت هستن 64 بیتی

8- بهترین متغیر برای نشان دادن کد اسکی یک کاراکتر چیه؟ منظورم اینه چون کد اسکی یک کاراکتر به عدد تبدیل می شه از short استفاده کنیم یا int

9- در جای خالی زیر چه کلمه ای باید بذاریم:

.NETFramewrok ماشین مجازی ... است. ( .NET یا ویندوز)

10- من مفهوم struct که مخفف structure هست رو درک نمی کنم. یعنی مایکروسافت یک اسم بی معنی براش انتخاب کرده یا این نام گذاری هدفمنده. این ساختار بودن رو درک نمی کنم که داخل کلاس قرار می گیره.

11- توی یک انجمن دیگه یک فردی یک سوالی پرسید و یک برنامه نویس مفهوم کلاس رو به این صورت توصیف کرد:

"کلاس یک مفهوم انتزاعیه" ...

"فرض کنید که یه روز در اتاق تون نشسته اید و یک مفهوم میاد در ذهن تون. این مفهوم استوانه ای سفالی رو توصیف می کنه که یک قاعده ی اون بسته و قاعده ی دیگر اون باز هستش و برای اون یک دسته در وجه جانبی در نظر گرفته شده. کاربرد این مفهوم می تونه نوشیدن مایعات باشه. شما نام این مفهوم Class رو می ذاریدو لیوان (mug). قاعدتا لیوان توصیف شده تا الان یک مفهوم بوده و تا زمانی که یک شی فیزیکی (object) از اون ساخته نشه، نمیشه ازش برای آشامیدن مایعات استفاده کرد."

می خوام بدونم این تعریف درسته چون در ویژوال استودیو ما داخل کلاس انواع کد ها رو می بینیم یا متغیر ها رو و شاید فقط یک چیز در ذهن ما نباشه.

مثلا ما می تونیم کلاس وسائل نقلیه داشته باشیم که شامل سواری و اتوبوس و هواپیما می شه که مثلا برای کلاس سواری می تونیم سمند و پراید رو داشته باشیم. حالا کلاس وسائل نقلیه، سواری، اتوبوس و هواپیما یک مفهوم هستند اما سمند و پراید هر کدوم یک شی هستند. اما در عین شی بودن می تونن یک کلاس هم باشن چون دارای اجزای مختلفی هستند هم دارای خواص و هم متد هستند. و کلا این بحث کلاس و شی در هم تنیده شده هستن و بعضی وقت ها آدم گیج می شه. چون اکثرا دیدم که دو نوع برداشت از سی شارپ دارن. یک عده میگن هر چی ما در سی شارپ بنویسیم فقط به صورت شی گرایی هست و به غیر از شی گرایی نمی تونیم طور دیگه ای بنویسیم. حتی مقدار یک متغیر رو شی می دونن. اما من چند وقت پیش یک پروژه ای دیدم که نوشته بود من یک برنامه در سی شارپ نوشتم و مثلا انقدر پول می دم یکی به صورت شی گرایی درش بیاره. آیا واقعا همینطوری که ما کدها رو می نویسم داریم روش شی گرایی رو به کار می بریم یا اینکه شی گرایی دارای یک ساختار درست و منظم و حرفه ایه که باید طبق اصولی رعایت بشه. اگه اینطور هست این ساختار رو به صورت کلی و تیتر وار نام ببرید.

سلام بر آقا رامین . اول من جواب بدم بعد استاد علی تکمیل کنن. البته اگه خودتون مایل باشین.

1) فرقی نداره . خیلی از کارها را شما اصلا ممکنه انجام ندین ولی کمپایلر خودش اتوماتیک کدها را اصلاح میکنه و انجام میده . مثلا شی this را خیلی جاها ممکنه نیارید ، خودش اتوماتیک اضافه میکنه . با کلمه ی کلیدی var هم به کمپایلر اعلام میکنید که بجای شما ، خودش (زمانی که کد را مینویسید) نوعش را مشخص کنه بنابراین خودش نوعش را int میگیره (اگه myArray ، آرایه ای از int ها باشه) بنابراین فرقی نداره.

2) نام هه دیگه ، هر چی دوست داری بذار.
به نظرم همون فرض بشه . حالا استاد علی بذارین چه نظری میدن.

3) همه شون نیاز هستن . اگه منظورتون از int[][] اینه که مثلا تا سطح آرایه ی دندونه ای 2 بعد را یاد بگیرین و بقیه 3 بعدی و ... لازم نیست ، فرقی نداره . شما کافیه که آرایه ی دندونه ای دو بعدی (دو تا آرایه) را یاد بگیرین . بقیه را هم اتوماتیک بلد میشین. کلا به نظرم آرایه های دندونه ای مهمتر از اونها هستن.

4) دومی به نظرم درست تره.

5) چون کلاس هست (reference type) ، شی اش در حافظه ی هیپ قرار میگیره . همه ی value type ها هم در استک .اشاره گر به اون حافظه ی رشته رو با اونکه value type هست ، دقیق نمیشه مشخص کرد چون قضیه ی شی گرایی پیش میاد و ممکنه این عضوی که تعریف شده ، در کلاسی تعریف شده باشه و اون ، چون کلاس هست ، خودش در حافظه ی هیپ قرار میگیره پس اعضاش هم در حافظه ی هیپ قرار میگیره :

Memory Management for Class Instance

6) منظورتون را یه کم توضیح بدین چیه؟

7) بمونه برای استاد علی

8) چون هر کاراکتر در سی شارپ ، 2 بایت اشغال میکنن ، پس کدهای اسکی اش در نوع short جا میشن. حالا بالاتر هم گرفتین ، گرفتین.

9) بمونه برای استاد علی

10) متوجه نشدم؟!

11) بله درسته .
نه اونی که گفتید کلاس سمند و پراید ، شی نیستن . الان در کلاس پراید زیر :


کد:
public class Pride
{

}

شما کجا شی ای از کلاس Pride میبینید؟
صرفِ تعریف کلاس ، ایجاد شی از اون کلاس نیست . شی ، زمانی هست که شما ازش شی بسازید . مثل زیر :


کد:
Pride myPride = new Pride();

اونی هم که گفتید :
"حالا کلاس وسائل نقلیه، سواری، اتوبوس و هواپیما یک مفهوم هستند"
چیزی که مد نظرتون هست ، بهش (به این وسائل نقلیه، سواری، اتوبوس و هواپیما) میگن abstract class یا کلاس های انتزاعی که نوعی از کلاس هستن که نمیشه ازشون شی ساخت و داستان داره.
 

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد علی
چرا گفتین الزاما نه؟
چون مستند نیست، چیزی روی میتوانید رویش حساب باز کنید که مستند باشه، نه بر پایه نمونه آماری. مثلا اگر روی 100 تا کامپیوتر بررسی کردید و WinRar در همه شون در C:\Program Files\WinRAR نصب شده بود، نمی توانید نتیجه بگیرید که WinRAR همیشه در C:\Program Files\WinRAR موجوده. این چیزی که شما تحلیل کردید فقط نمونه آماری ئه، برای 100 درصد نمونه ها هم صدق کنه همچنان قطعیت نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
چون مستند نیست، چیزی روی میتوانید رویش حساب باز کنید که مستند باشه، نه بر پایه نمونه آماری. مثلا اگر روی 100 تا کامپیوتر بررسی کردید و WinRar در همه شون در C:\Program Files\WinRAR نصب شده بود، نمی توانید نتیجه بگیرید که WinRAR همیشه در C:\Program Files\WinRAR موجوده. این چیزی که شما تحلیل کردید فقط نمونه آماری ئه، برای 100 درصد نمونه ها هم صدق کنه همچنان قطعیت نداره.

خیلی ممنون
اما فکر کنم همین باشه ها .
توی یه سیستم دیگه هم تست کردم ، همون فرمول بود .
البته علاوه بر اون زمان ، اون تاریخ هم بر حسب gmt هه به احتمال بسیار زیاد.
 

the_king

مدیرکل انجمن
سلام استاد علی
چند سوال دارم

1- فرض کنید یک آرایه ای از int داریم حالا در دستور foreach بهتره همون var بیاد یا int

کد:
foreach (var item in myArray)

foreach (int item in myArray)
در اجرا هیچ تاثیری نداره، چون مشابه هم خواهند بود، کامپایلر خودش int رو جایگزین var خواهد کرد. اما برای کد نویسی بهتره تا جایی که امکانش هست از var استفاده کنید تا اگر احیانا به دلیلی لازم شد تغییری در نوع داده myArray بدید، نیاز به ویرایش نوع مواردی مثل item نباشه. دقت کنید که در مواردی var کارایی نداره و مجبور هستید که خودتون صریحا نوع داده رو مشخص کنید. مثلا وقتی foreach برای مجموعه ای مثل ListBox.Items اجرا میشه اگه از var استفاده کنید، می بینید که نوع داده متغیر رو object گرفته. دلیلش اینه که نوع اعضاء داخل Items مشخص و الزاما یکسان نیست و var نمیتونه بصورت خودکار و هوشمند بفهمه بجای object چه نوع داده مشخص دیگری مناسبه چون نمیدونه شما چه مقادیری داخل مجموعه قرار داده اید. در حالی که شما شاید بدانید که داخل ListBox فقط مقادیر string قرار داده اید و میتوانید از نوع string برای متغیر استفاده کنید، این رو var متوجه نخواهد شد.

2- در سی شارپ آرایه یک بعدی داریم دو بعدی داریم و الی آخر. پس آرایه دندانه دار رو چی باید بگیم مثلا برای هر کدوم از ارایه های زیر می شه نام بذاریم.
کد:
int[][] myJaggedArray;

int[][,] myJaggedArray;
مثلا در مورد اولی اگه بگیم دو بعد داره؛بعد اول و بعد دوم، پس با آرایه دو بعدی اشتباه می شه یا ممکنه همون فرض بشه.یا در مورد دومی بگیم کلا دو بعد داره و آرایه دومیش هم دو بعدیه
آرایه دندانه دار آرایه دو بعدی نیست، آرایه تک بعدی ای است که هر کدوم از اعضاء اش خودشون یک آرایه از هر نوع دلخواهی هستند، حالا اینکه اعضاء آرایه دو بعدی باشند یا تک بعدی یا دندانه دار، تفاوتی در اصل قضیه که این یک آرایه دندانه دار ئه نداره. مثلا ممکنه اولین عضو اش یک آرایه تک بعدی 4 عضوی باشه و دومین عضو اش یک آرایه 100 عضوی باشه و سومین عضو اش اصلا null باشه :
کد:
            int[][] a;
            a[0] = new int[4];
            a[1] = new int[100];
            a[2] = null;
همچین ساختاری شباهتی به اون ساختار منظم و مستطیلی/مربعی آرایه دو بعدی نداره. در آرایه دو بعدی شما یک تعداد مشخص سطر دارید و یک تعداد مشخص ستون. اما در آرایه دندانه ای تعداد ستون های هر سطر مستقل از تعداد ستون در سطر های دیگه است.
و شاید کد زیر کمک کنه تا تفاوت بین آرایه دو بعدی و آرایه دندانه دار رو بهتر درک کنید. a اینجا یک آرایه دندانه دار ئه که اعضاء اش خودشون آرایه دندانه دار هستند. دقت کنید که هر کدوم از اون a[0] و a[1] و a[2] ها یک آرایه دندانه دار کاملا مستقل و با تعداد اعضاء کاملا متفاوت هستند. هیچ لزومی نداره که مشابه آرایه سه بعدی تعداد اعضاء در هر بعد همیشه مشخص و ثابت باشه :
کد:
            int[][][] a;
            a[0] = new int[][] { new int[2], new int[4], null, new int[4] };
            a[1] = new int[][] { null, null };
            a[2] = null;

3- چون شما تجربه برنامه نویسی بسیار زیادی دارین در واقعیت برنامه نویسی کدوم آرایه ها رو باید یاد بگیریم و کدوما نیازی نیست. مثلا آرایه یک بعدی و دو بعدی و سه بعدی و در آرایه های دندانه دار این سه مورد زیر کافیه (به سطح علمی من نگاه نکنید هر کدوم نیازه لطفا بفرمایید تا من تمرین کنم)
کد:
int[][]

int[][][]

int[][,]
تجربه بسیار زیادی هم نیست، در حد قابل توجه، نه بیشتر.
هیچکدوم از این ساختار ها اضافی یا بدون کاربرد نیستند، در نظر بگیرید که شما با ترکیب های متفاوتی روبرو میشید، حفظ کردنی نیستند، مفهوم شون رو باید درک کنید. مثلا جدول ضرب 10x10 ذاتا از شکلش پیداست، یک آرایه دو بعدی است، دلیلی نداره برای جدول ضرب که تعداد سطر و ستون مشخصه، از آرایه دندانه ای استفاده کنید. شما جدول ضربی پیدا نخواهید کرد که در سطر دوم بیشتر یا کمتر از سطر اول خانه داشته باشه.
اما فرضا تعداد روز در تقویم شمسی برای هر ماه متفاوته، تقویم شمسی یک آرایه 12x31 نیست. برای تقویم یک آرایه دندانه دار که برای هر ماه تعداد اعضاء متفاوتی داره مناسبتره تا یک آرایه دو بعدی که برای اسفند 31 خانه داره.
و وقتی در محاسبات ریاضی بجایی رسیدید که لازمه چندین آرایه دو بعدی داشته باشید، طبعا آرایه دندانه داری از نوع [,][] int بدرد شما خواهد خورد.

4- طبق اصول برنامه نویسی کدوم نوع نوشتن درست تره هر چند نتیجه یکی در بیاد
کد:
int[] myArray = { 10, 15 };

int[] myArray = new int[]{ 10, 15 };
اینجا درست و غلطی وجود نداره، صرفا خلاصه نویسی است، برای افزایش سرعت کد نویسی و کاهش حجم کد. در اجرا تفاوتی بین ایندو نیست که بگیم بهینه سازی انجام شده باشه تا سرعت برنامه بیشتر بشه.
حالت سلیقه ای داره. چطور که من عادت دارم if رو همیشه با } و { بنویسم حتی اگر فقط یک دستور میان شون قرار بگیره یا همیشه شرط false با (a == false) می نویسم، و نه با (a!) چون به نظرم اینطوری خوانا تر هستند.
 

the_king

مدیرکل انجمن
5- اگه کد زیر بنویسم رشته C++ همچنان در حافظه هیپ وجود داره؟ چون string کلاسه اینو پرسیدم.

کد:
string string1 = "C++";

string1 = "C#";
اولا Heap ای وجود نداره، شما در هیچ جای کد #C تون به ساختار حافظه دسترسی ندارید که بگید نوعش Heap هست یا نیست. مثل اینه که شما در اتاقی باشید که و در مورد رنگ لوازم خانه واحد بالایی نظر بدید.
ثانیا از لحظه ای که شما اون مقدار دهی دوم رو انجام دادید، شیء مربوط به "++C" در اختیار GC که مدیریت حافظه های داخل NET. رو بر عهده داره قرار میگیره که هر وقت لازم دونست آزادش کنه. از دید کد شما دیگه اون حافظه بلا استفاده و آزاد شده است، ولی از نظر فنی ممکنه به این زودی آزاد نشه و در حافظه سر جایش بمونه. این باقی موندنش مشکل ساز نیست، کد شما درگیر این قضیه نیست که کی آزاد بشه.
برای کد شما فرقی نمی کنه که کی آزاد میشه و به هر حال اصولا آزاد سازی با تاخیر صورت میگیره، کد شما هم کنترلی روی اون زمان آزاد سازی نداره.

6- به عکس زیر نگاه کنید اون علامت هایی که زدم درسته؟ (به عددها توجه نکنید برای راهنمایی گذاشته شده منظورم خود کروشه است)

vz3r_uu.jpg
شما وقتی متغیری رو از نوع آرایه فلان تعریف کردید، طبعا موقع مقدار دهی با new هم همون نوع آرایه رو می نویسید، تا اینجای کار اشتباه نیست، اما شما نمی توانید برای یک ارایه دندانه دار چیزی مثل int[2][2] رو تعریف کنید، این آرایه دو بعدی نیست که شما دو سطر و دو ستون داشته باشید. شما باید یک []int[2] ای بسازید که بعد اعضاء اش حالا می توانند int[2] باشند یا نباشند. نمی توانید در تعریف بجز اون بعد اول (اندیس اول) بقیه رو مقدار دهی کنید. همانطور که می توانید [][][2]new int رو تعریف کنید، ولی [][4][2]new int رو نه.

7- دو تا سوال از گذشته: آیا جمله های زیر درست هستند

الف: یک dll یا 32 بیتیه یا 64 بیتی و نمی شه همزمان هم 32 بیتی باشه و هم 64 بیتی
چیزی که میگید برای کتابخانه هایی که برای اجرا توسط ماشین مجازی ساخته شدن میتونه نادرست باشه، چون ماشین مجازی این امکان رو میده که کد خروجی موقع اجرا تغییر شکل بده.
فرضا NET. ماشین مجازی داره، dll ای که در محیط NET. میسازید، مستقیم در پردازنده کامپیوتر تون اجرا نمیشه و اصلا کدش به زبان پردازنده نیست. برای همین کتابخانه ای که با #C یا Visual Basic .NET کد نویسی می کنید میتونه با یک تنظیم طوری کامپایل بشه که در محیط 32 بیتی به کد ماشین 32 بیتی ترجمه بشه و در محیط 64 بیتی به کد ماشین 64 بیتی و همزمان هر دوشون رو پشتیبانی کنه. اما در مورد کتابخانه هایی که به زبان ماشین پردازنده کامپایل می کنند و به اصطلاح Native هستند، مثلا کامپایلر های C++ Native (برخلاف C++ CLI) حرفتون درسته. دقت کنید که ماشین مجازی داشتن الزاما به این معنی نیست که حتما همزمان بتونه 32 / 64 بیتی باشه. فرضا ویژوال بیسیک 6 (ویژوال بیسیک کلاسیک) هم ماشین مجازی داره ولی خروجی اش همیشه 32 بیتی ئه.

ب: اگه anycpu رو انتخاب کنیم و در برنامه خودمون dll های 32 بیتی و 64 بیتی همزمان داشته باشیم اونایی که 32 بیتی هستن 32 بیتی اجرا میشن و اونایی که 64 بیت هستن 64 بیتی
نه، یک برنامه که داره الان در مدل حافظه 32 بیتی اجرا میشه نمیتونه با کتابخانه ای که برای مدل حافظه 64 بیتی نوشته شده ارتباط برقرار کنه و برعکس. همیشه باید با هم منطبق باشند.
اگر روی Any CPU قرارش دادید و برنامه تون در ویندوز 32 بیتی اجرا بشه، باید حتما با dll هایی کار کنید که یا 32 بیتی باشند یا همزمان 32/64 بیتی رو پشتیبانی کنند و هم برنامه و هم dll ها در مدل حافظه 32 بیتی اجرا خواهند شد.
اگر روی Any CPU قرارش دادید و برنامه تون در ویندوز 64 بیتی اجرا بشه، باید حتما با dll هایی کار کنید که یا 64 بیتی باشند یا همزمان 32/64 بیتی رو پشتیبانی کنند و هم برنامه و هم dll ها در مدل حافظه 64 بیتی اجرا خواهند شد.

8- بهترین متغیر برای نشان دادن کد اسکی یک کاراکتر چیه؟ منظورم اینه چون کد اسکی یک کاراکتر به عدد تبدیل می شه از short استفاده کنیم یا int
ابتدا این مورد رو در نظر بگیرید که جدول ASCII همون جدول 7 بیتی System.Text.Encoding.ASCII ئه که اصلا کاراکتر هایی مثل حروف زبان فارسی و عربی داخلش جا نمیشه. اگه منظورتون کد کاراکتر ها است، نباید از عبارت ASCII استفاده کنید. کد کاراکتری که شما عموما بهش رجوع میکنید یا Unicode ئه که 16 بیتی است و Encoding عادی ویندوز و NET. ئه و یا UTF-8 که بیشتر در وب و اینترنت کاربرد داره و طول کاراکتر هایش متغیره.
از دیدگاه های متفاوت نتیجه های متفاوتی میگیرید. در حالت کلی بهترینی وجود نداره.
اگر هدف کاهش حجم حافظه مورد نیاز باشه، UTF-8 که با byte کار میکنه بهتر از short یا int ئه.
اگر هدف افزایش سرعت باشه، int در حالت کلی سربار پردازشی کمتری داره چون بردازنده های مدرن فعلی معماری شون حالتی داره که محاسبات 32 بیتی براشون راحت تر از پردازش روی انواع داده ای کوچکتره.

9- در جای خالی زیر چه کلمه ای باید بذاریم:

.NETFramewrok ماشین مجازی ... است. ( .NET یا ویندوز)
هیچکدوم، NET Framework. ماشین مجازی نیست، Framework ئه، یک چارچوب ئه، یک مجموعه نرم افزاری است. داخل NET Framework یک بخشی وجود داره که ماشین مجازی اونه.
ماشین مجازی داخلش اسم مشخصی هم داره، اسمش Common Language Runtime ئه، یا همون CLR. خود NET Framework. معادل اون ماشین مجازی نیست، ماشین مجازی فقط یک جزء داخلشه.

10- من مفهوم struct که مخفف structure هست رو درک نمی کنم. یعنی مایکروسافت یک اسم بی معنی براش انتخاب کرده یا این نام گذاری هدفمنده. این ساختار بودن رو درک نمی کنم که داخل کلاس قرار می گیره.
داده های شما میتوانند ساده باشند مثل int یا ترکیبی از چند داده مختلف باشند که کنار هم معنی خاصی میدهند، مثل مشخصات پلاک خودرو. شما می توانید پلاک خودرو رو بصورت کلاس تعریف کنید، اما بخاطر ذات کلاس ها که reference type هستند گاهی این کلاس بودن دردسر میشه، مثلا زمانی که میخواهید از مقادیر داده ترکیبی تون کپی بگیرید و نمی خواهید با تغییر مقدار در یک کپی، اون یکی مقدار هم تغییر کنه.
struct دو تا ویژگی داره که مناسب داده های ترکیبی است. اولا value type ئه و تکثیر مقادیرش ساده است و ثانیا ترتیب و موقعیت قرارگیری داده هاش در حافظه مشخص و قابل تنظیمه که برای ارتباط با محیط خارج از NET. که مملو از اینجور ساختار ها است مناسبش می کنه. برخلاف کلاس که شما نه میدانید که مقادیر داخل شیء با چه ترتیبی در حافظه ذخیره شده اند و نه براتون اهمیتی پیدا میکنه.

11- توی یک انجمن دیگه یک فردی یک سوالی پرسید و یک برنامه نویس مفهوم کلاس رو به این صورت توصیف کرد:

"کلاس یک مفهوم انتزاعیه" ...

"فرض کنید که یه روز در اتاق تون نشسته اید و یک مفهوم میاد در ذهن تون. این مفهوم استوانه ای سفالی رو توصیف می کنه که یک قاعده ی اون بسته و قاعده ی دیگر اون باز هستش و برای اون یک دسته در وجه جانبی در نظر گرفته شده. کاربرد این مفهوم می تونه نوشیدن مایعات باشه. شما نام این مفهوم Class رو می ذاریدو لیوان (mug). قاعدتا لیوان توصیف شده تا الان یک مفهوم بوده و تا زمانی که یک شی فیزیکی (object) از اون ساخته نشه، نمیشه ازش برای آشامیدن مایعات استفاده کرد."

می خوام بدونم این تعریف درسته چون در ویژوال استودیو ما داخل کلاس انواع کد ها رو می بینیم یا متغیر ها رو و شاید فقط یک چیز در ذهن ما نباشه.

مثلا ما می تونیم کلاس وسائل نقلیه داشته باشیم که شامل سواری و اتوبوس و هواپیما می شه که مثلا برای کلاس سواری می تونیم سمند و پراید رو داشته باشیم. حالا کلاس وسائل نقلیه، سواری، اتوبوس و هواپیما یک مفهوم هستند اما سمند و پراید هر کدوم یک شی هستند. اما در عین شی بودن می تونن یک کلاس هم باشن چون دارای اجزای مختلفی هستند هم دارای خواص و هم متد هستند. و کلا این بحث کلاس و شی در هم تنیده شده هستن و بعضی وقت ها آدم گیج می شه. چون اکثرا دیدم که دو نوع برداشت از سی شارپ دارن. یک عده میگن هر چی ما در سی شارپ بنویسیم فقط به صورت شی گرایی هست و به غیر از شی گرایی نمی تونیم طور دیگه ای بنویسیم. حتی مقدار یک متغیر رو شی می دونن. اما من چند وقت پیش یک پروژه ای دیدم که نوشته بود من یک برنامه در سی شارپ نوشتم و مثلا انقدر پول می دم یکی به صورت شی گرایی درش بیاره. آیا واقعا همینطوری که ما کدها رو می نویسم داریم روش شی گرایی رو به کار می بریم یا اینکه شی گرایی دارای یک ساختار درست و منظم و حرفه ایه که باید طبق اصولی رعایت بشه. اگه اینطور هست این ساختار رو به صورت کلی و تیتر وار نام ببرید.
چند تا نکته است که البته با ترتیب متفاوتی نسبت به سوال شما مطرح می کنم.
اولا بعضی زبان ها ترکیبی از چند شیوه برنامه نویسی رو پشتیبانی می کنند، مثل ++C، به همین جهت ممکنه یک کد ++C با دید شیء گرایی نوشته شده باشه یا نوشته نشده نباشه که به اینجور زبان ها Multi Paradigm میگن. خیلی اوقات کدی به عنوان کد زبان ++C معرفی میشه که شیء گرا هم نیست در حالی که در اصل یک کد زبان C ئه، ولی چون ++C از توسعه C بدست اومده پشتیبانیش میکنه. #C جزو این زبان ها نیست و ذاتا شیء گرا است، بنابراین اگه کسی کدی به زبان #C نوشته، شیء گرایی در اون وجود داره، حالا ممکنه کد نویس خیلی از کلاس و شیء استفاده نکرده باشه و تاکیدش روی متد ها باشه، ولی به هر حال دیدگاه شیء گرایی در همه کد های #C هست.

ثانیا کلا هر چیزی که بصورت نرم افزاری بوجود اومده یک مفهوم انتزاعی است، بوجود اومده تا شما بتوانید با پردازنده کامپیوتر ارتباط برقرار کنید، ازش کار بکشید و خروجی ای دریافت کنید که برای شما قابل فهم باشه.
وگرنه پردازنده کامپیوتری که فقط بیت های 0 و 1 رو میشناسه هیچ درکی از کلاس، متد، متغیر، ویژوال استدیو، ویندوز، فایل، فولدر و ... نداره.
تمامی این موارد که برای شما معنی داره برای پردازنده کامپیوتر بی معنیه. همانطور که درکی که پردازنده از بیت ها داره برای شما خیلی سطحی و فاقد هوشمندی است.

ثالثا اصول برنامه نویسی به دلایل فنی یا برای راحت تر شدن کار بوجود میان، نه برای ایجاد کردن محدودیت های غیر منطقی. اگر در فلان زبان فرضا روی اصول شیء گرایی تاکید میشه به این دلیل ئه که کامپایلر زبان یا خارج از یکسری قواعد نمیتونه کد رو کامپایل کنه، یا طوری طراحی شده که اگه یکسری قواعد و اصول رعایت بشه بتونه کد خروجی رو بهتر بهینه کنه. وگرنه برای طراح کامپایلر چه اهمیتی داره که شما که در خونه تون در حال کد نویسی هستید کد رو اصولی می نویسید یا نه. مادامی که شما نتیجه ای که لازمه از شیوه کد نویسی تون میگیرید اهمیتی نداره که چقدر با اصول پیش میرید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا Heap ای وجود نداره، شما در هیچ جای کد #C تون به ساختار حافظه دسترسی ندارید که بگید نوعش Heap هست یا نیست. مثل اینه که شما در اتاقی باشید که و در مورد رنگ لوازم خانه واحد بالایی نظر بدید.
ثانیا از لحظه ای که شما اون مقدار دهی دوم رو انجام دادید، شیء مربوط به "++C" در اختیار GC که مدیریت حافظه های داخل NET. رو بر عهده داره قرار میگیره که هر وقت لازم دونست آزادش کنه. از دید کد شما دیگه اون حافظه بلا استفاده و آزاد شده است، ولی از نظر فنی ممکنه به این زودی آزاد نشه و در حافظه سر جایش بمونه. این باقی موندنش مشکل ساز نیست، کد شما درگیر این قضیه نیست که کی آزاد بشه.
برای کد شما فرقی نمی کنه که کی آزاد میشه و به هر حال اصولا آزاد سازی با تاخیر صورت میگیره، کد شما هم کنترلی روی اون زمان آزاد سازی نداره.

سلام
چرا میگید heap در سی شارپ وجود نداره استاد؟
من خیلی جاها دیدم که به حافظه ی heap حتی در دات نت اشاره کردن .
درسته که به ساختار حافظه در سی شارپ دسترسی نداریم (حالا نمیدونم بصورت unsafe کد بنویسیم ، میتونیم مدیریت اش کنیم یا نه ولی بصورت unmanaged و با کلاس marshal ، تا حدودی میشه)

Heaps and Stacks in C# - Loading Developer

Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing

Stack and Heap Memory Allocation

Memory Management for Class Instance

https://stackoverflow.com/questions/4487289/memory-allocation-stack-vs-heap
 

the_king

مدیرکل انجمن
سلام
چرا میگید heap در سی شارپ وجود نداره استاد؟
من خیلی جاها دیدم که به حافظه ی heap حتی در دات نت اشاره کردن .
درسته که به ساختار حافظه در سی شارپ دسترسی نداریم (حالا نمیدونم بصورت unsafe کد بنویسیم ، میتونیم مدیریت اش کنیم یا نه ولی بصورت unmanaged و با کلاس marshal ، تا حدودی میشه)

Heaps and Stacks in C# - Loading Developer

Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing

Stack and Heap Memory Allocation

Memory Management for Class Instance

https://stackoverflow.com/questions/4487289/memory-allocation-stack-vs-heap
#C زبانی است که شما دارید با اون کد نویسی می کنید، اگر Heap رو داخلش ببینید و بهش دسترسی داشته باشید در #C ئه Heap وجود داره و اگر در #C ئه Heap رو نبینید و بهش دسترسی نداشته باشید Heap ای وجود نداره.
دیگه از این ساده تر و بدیهی تر؟ شما توی این منابعی که لینک دادید، یک سطر کد مرتبط با Heap می بینید؟ یا اصلا ارتباطی بین حافظه بیرون از NET. و اون Heap ای که داخل #C دنبالش میگردید می بینید که میگید با Marshal تا حدودی میشه؟ کجاست اون تا حدودی؟ با چه نمونه کدی؟ شما دو سطر کد پیدا کردید که باهاش تا حدودی Heap داخل NET. مدیریت بشه؟ چه چیزی در #C دیدید که ربطش بدید به حافظه Heap.
یک چیزی که ماورای زبان ئه رو برای چی میخواهید بزور بچسبونید به مفاهیم داخل زبان.
 

SU-57

Active Member
6) منظورتون را یه کم توضیح بدین چیه؟
سلام سجاد جان
اون کد خودته در فیلم آموزشی. منظورم اینه که اون دو تا کروشه که در سمت راست تساوی است دقیقا کدوم دو تا کروشه در سمت راسته. به عکس های زیر نگاه کن ببین کدوم درسته

w2g_b1.jpg


qq1l_b2.jpg


حالت سلیقه ای داره. چطور که من عادت دارم if رو همیشه با } و { بنویسم حتی اگر فقط یک دستور میان شون قرار بگیره یا همیشه شرط false با (a == false) می نویسم، و نه با (a!) چون به نظرم اینطوری خوانا تر هستند.
استاد علی ممنونم از پاسخ های کامل شما.
الان از بین دو کد زیر کدوم خواناتر و بهتره از دید شما.

کد:
string a = string.Empty;

string a = "";
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام سجاد جان
اون کد خودته در فیلم آموزشی. منظورم اینه که اون دو تا کروشه که در سمت راست تساوی است دقیقا کدوم دو تا کروشه در سمت راسته. به عکس های زیر نگاه کن ببین کدوم درسته

w2g_b1.jpg


qq1l_b2.jpg



استاد علی ممنونم از پاسخ های کامل شما.
الان از بین دو کد زیر کدوم خواناتر و بهتره از دید شما.

کد:
string a = string.Empty;

string a = "";

سلام
آها
به نظرم به این شیوه یاد نگیرین ، بهتره . بجاش اصولی تر و بر اساس اشاره گرها یاد بگیرین . یعنی بر اساس همون چیزهایی که در قسمت 17 و 18 گفتم . یعنی اون آرایه ی myArray ، اشاره گر به صفر امین ایندکس (عضو) از خونه اش هست و داستان های اشاره گر را که گفتم .
اما به هر حال اگه اصرار دارین این جوری برای خودتون تفهیم کنید (هر چند به نظرم اصولی نیست و گیج کننده تر هم هست) ، میتونین از مثال ساده ی آرایه ی تک بعدی برای خودتون مثال بزنید . در مثال زیر :


کد:
int[] myArray = new int[] { 10, 20, 30 };

اعضای داخل آرایه (یعنی 10 و 20 و 30) ، برابر کدوم قسمت از نوع داده ای myArray هستن؟ برابر int[] (آرایه ای از int ها) هستن؟ یا برابر int هستن؟ مشخص هست برابر int هستن . یعنی پرانتز آخری را حذف کنید ، برابر با اعضای داخل آرایه میشه . بنابراین عکس دومی در بالا درسته.
 

the_king

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

w2g_b1.jpg


qq1l_b2.jpg
در تصویر سطر بالایی درسته، برای مطمئن شدن خودتون می توانید با یک تغییر نوع ساده در کد تون تشخیص بدید، یعنی ببینید کدوم یکی از کد های زیر کار میکنه و کدوم یکی خطا میده :
کد:
            int[][,] myarray2 = new int[][,] { new int[,] { }, new int[,] { } };
            int[,][] myarray3 = new int[,][] { new int[,] { }, new int[,] { } };
اگر در تصویر سطر پایینی درست بود باید myarray2 با خطا روبرو می شد و myarray3 خطایی نمی داشت، در حالی که بر عکسه.
همیشه مقدار دهی آرایه های تو در تو از بعد های خارجی (در تعریف آرایه از سمت چپ به راست) انجام میشه. هر } که باز می کنید یکی از اون ابعاد رو از سمت چپ به راست مشخص کرده اید و وارد بعد داخلی تر شده اید.

الان از بین دو کد زیر کدوم خواناتر و بهتره از دید شما.

کد:
string a = string.Empty;

string a = "";
یک مساله سلیقه ای است، من در جستجوی کد ها برای مقادیر اولیه string.Empty رو ترجیح میدم، چون زودتر به چشم میخوره و در Search هم راحت تر پیدا میشه.
ولی برای رشته ای که قراره کم کم بهش مقدار افزوده بشه، از "" استفاده می کنم. صرفا سلیقه منه. اهمیت خاصی نداره که کدوم یکی شون رو با چه معیاری انتخاب کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در تصویر سطر بالایی درسته، برای مطمئن شدن خودتون می توانید با یک تغییر نوع ساده در کد تون تشخیص بدید، یعنی ببینید کدوم یکی از کد های زیر کار میکنه و کدوم یکی خطا میده :
کد:
            int[][,] myarray2 = new int[][,] { new int[,] { }, new int[,] { } };
            int[,][] myarray3 = new int[,][] { new int[,] { }, new int[,] { } };
اگر در تصویر سطر پایینی درست بود باید myarray2 با خطا روبرو می شد و myarray3 خطایی نمی داشت، در حالی که بر عکسه.
همیشه مقدار دهی آرایه های تو در تو از بعد های خارجی (در تعریف آرایه از سمت چپ به راست) انجام میشه. هر } که باز می کنید یکی از اون ابعاد رو از سمت چپ به راست مشخص کرده اید و وارد بعد داخلی تر شده اید.


یک مساله سلیقه ای است، من در جستجوی کد ها برای مقادیر اولیه string.Empty رو ترجیح میدم، چون زودتر به چشم میخوره و در Search هم راحت تر پیدا میشه.
ولی برای رشته ای که قراره کم کم بهش مقدار افزوده بشه، از "" استفاده می کنم. صرفا سلیقه منه. اهمیت خاصی نداره که کدوم یکی شون رو با چه معیاری انتخاب کنید.

سلام
آها توی آرایه های دندانه ای یا چند بعدی ، بر عکسِ حالت آرایه های تک بعدی میشه؟
پس آقا رامین ببخشید . پست 1211 ام اشتباه هست . نمیدونستم اشتباه هه.
حالا چرا نسبت به آرایه ی تک بعدی ، برعکس هه؟!

---------------------------------------------------

بعد اینکه اون قضیه ی محافظت از فایل های بکاپ که گفته بودم ، از طریق سِت کردنِ مجوز و permission هم نمیشه؟ :

prevent a file from being deleted

البته این هم گفت که کسایی که مجوز administrator دارن ، نمیشه کاریش کرد.

جواب پست 1196 تون هم بدافزارهای مربوط به باج افزار هستن . باج افزاری که فایلی را بدون قابلیت ریکاوری کردن ، پاک کنه اما طرف توی سیستم خودش بکاپ vss رو داشته باشه که باج افزار به هدفش نمیرسه . بنابراین اولین (یا آخرین) هدف باج افزارها ، حذف بکاپ های vss هست.
میگم الان ویروس ها (مثل باج افزارها) هم برای اجرا شدن و عملیات مورد نظرشون (حذف فایل بدون قابلیت ریکاوری و همچنین حذف بکاپ های vss) ، نیاز به اجرا شدن بصورت administrator دارن و اگه کاربری ، تنظیمات UAC اش روی حالت پیش فرض تنظیم شده باشه ، میتونه از اجرای اون فایل اجرایی باج افزار ، جلوگیری کنه دیگه؟ درسته؟

قبلا بحث کردیم اما بذارین دوباره مطرح کنم . اینکه پادویش داره از حذف شدنِ بکاپ ها محافظت میکنه ، توسط سطح درایور و سیستمی ، داره محافظت میکنه؟
چون اگه از طریق اون Security in COM محافظت میکرد ، فقط میتونست از فایل های بکاپی که خودش میگرفت ، محافظت کنه اما این کلا به پروسه نگاه نمیکنه که چه پروسه یا چه نرم افزاری ، بکاپ vss را تهیه کرد . کلا از هر نوع بکاپ vss (حالا بکاپ های از نوع ClientAccessibleWriters . بقیه را نمیدونم) محافظت میکنه . قبلا هم گفتم که احتمالا از همون روشی محافظت میکنه که ضد باجگیرش نمیذاره فایل های معمولی ، بصورت غیر قابل ریکاوری ، حذف بشن. یعنی قبل از حذف شدن فایل بصورت غیر قابل ریکاوری ، به کاربر پیام میده (کاربر اگه دوست داشت ، میتونه مانعِ حذف شدن بشه) . این حدسم ، درسته؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
آها توی آرایه های دندانه ای یا چند بعدی ، بر عکسِ حالت آرایه های تک بعدی میشه؟
پس آقا رامین ببخشید . پست 1211 ام اشتباه هست . نمیدونستم اشتباه هه.
حالا چرا نسبت به آرایه ی تک بعدی ، برعکس هه؟!


برعکس نیست، در آرایه تک بعدی هم تفسیر راست به چپ نداریم.

بعد اینکه اون قضیه ی محافظت از فایل های بکاپ که گفته بودم ، از طریق سِت کردنِ مجوز و permission هم نمیشه؟ :
prevent a file from being deleted

البته این هم گفت که کسایی که مجوز administrator دارن ، نمیشه کاریش کرد.
قبلا خودم در مورد اون قضیه permission بهتون گفتم، شما وقتی به کاربری که برنامه تون رو اجرا میکنه دسترسی میدید طبعا به ویروس هم که همون کاربر اجرا کننده اش هست دسترسی دادید.
اینجور دسترسی ها بیشتر برای شبکه کاربرد داره. در ضمن برای ویروسی که به کاربر ادمین دسترسی داره تغییر دادن دسترسی کار سختی نیست.

میگم الان ویروس ها (مثل باج افزارها) هم برای اجرا شدن و عملیات مورد نظرشون (حذف فایل بدون قابلیت ریکاوری و همچنین حذف بکاپ های vss) ، نیاز به اجرا شدن بصورت administrator دارن و اگه کاربری ، تنظیمات UAC اش روی حالت پیش فرض تنظیم شده باشه ، میتونه از اجرای اون فایل اجرایی باج افزار ، جلوگیری کنه دیگه؟ درسته؟
الزاما نه، برای همینه که نمیشه به صرف غیر Admin بودن کاربر سیستم رو بدون ویروس کش به امان خدا رها کرد.

قبلا بحث کردیم اما بذارین دوباره مطرح کنم . اینکه پادویش داره از حذف شدنِ بکاپ ها محافظت میکنه ، توسط سطح درایور و سیستمی ، داره محافظت میکنه؟
چون اگه از طریق اون Security in COM محافظت میکرد ، فقط میتونست از فایل های بکاپی که خودش میگرفت ، محافظت کنه اما این کلا به پروسه نگاه نمیکنه که چه پروسه یا چه نرم افزاری ، بکاپ vss را تهیه کرد . کلا از هر نوع بکاپ vss (حالا بکاپ های از نوع ClientAccessibleWriters . بقیه را نمیدونم) محافظت میکنه . قبلا هم گفتم که احتمالا از همون روشی محافظت میکنه که ضد باجگیرش نمیذاره فایل های معمولی ، بصورت غیر قابل ریکاوری ، حذف بشن. یعنی قبل از حذف شدن فایل بصورت غیر قابل ریکاوری ، به کاربر پیام میده (کاربر اگه دوست داشت ، میتونه مانعِ حذف شدن بشه) . این حدسم ، درسته؟
ربطی به درایور نداره، درایور کار اش چیز دیگری است. ممکنه نرم افزار سیستمی باشه و با کنترل و نظارت روی درخواست های دسترسی به سیستم فایل.

همانطور که ویروس کش ها به سادگی قابل Uninstall کردن هستند، سیستم دفاعی شون هم خیلی آسیب پذیره. اولین کاری که یک ویروس بعد از اجازه برای اجرا شدن پیدا میکنه از کار انداختن تمامی سیستم هایی است که برایش روال کارشون شناخته شده است. اگر غیر از این بود که نمیتوانستند سیستم رو آلوده کنند. تصور نکنید که هر سیستمی که آلوده شده یا باجگیر رویش عمل کرده پس حتما نرم افزار محافظتی نداشته.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
برعکس نیست، در آرایه تک بعدی هم تفسیر راست به چپ نداریم.


خیلی ممنون
من فکر کردم مثلا توی آرایه ی یک بعدی ، اعضاش که برابر نوع داده اش هستن (اعضاش ، برابر آرایه نیستن) پس برای اعضا ، آخرین آرایه اش حذف میشه .
پس کلا اعضای یک آرایه ، از چپ به راست تفسیر میشه .

قبلا خودم در مورد اون قضیه permission بهتون گفتم، شما وقتی به کاربری که برنامه تون رو اجرا میکنه دسترسی میدید طبعا به ویروس هم که همون کاربر اجرا کننده اش هست دسترسی دادید.
اینجور دسترسی ها بیشتر برای شبکه کاربرد داره. در ضمن برای ویروسی که به کاربر ادمین دسترسی داره تغییر دادن دسترسی کار سختی نیست.


الزاما نه، برای همینه که نمیشه به صرف غیر Admin بودن کاربر سیستم رو بدون ویروس کش به امان خدا رها کرد.


ربطی به درایور نداره، درایور کار اش چیز دیگری است. ممکنه نرم افزار سیستمی باشه و با کنترل و نظارت روی درخواست های دسترسی به سیستم فایل.

همانطور که ویروس کش ها به سادگی قابل Uninstall کردن هستند، سیستم دفاعی شون هم خیلی آسیب پذیره. اولین کاری که یک ویروس بعد از اجازه برای اجرا شدن پیدا میکنه از کار انداختن تمامی سیستم هایی است که برایش روال کارشون شناخته شده است. اگر غیر از این بود که نمیتوانستند سیستم رو آلوده کنند. تصور نکنید که هر سیستمی که آلوده شده یا باجگیر رویش عمل کرده پس حتما نرم افزار محافظتی نداشته.

میشه نرم افزار سیستمی را توی سی شارپ نوشت؟ اگه میشه ، چقدر سختی داره؟ اگه بازم میشه ، منابعش را میتونین بدین؟
ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون
من فکر کردم مثلا توی آرایه ی یک بعدی ، اعضاش که برابر نوع داده اش هستن (اعضاش ، برابر آرایه نیستن) پس برای اعضا ، آخرین آرایه اش حذف میشه .
پس کلا اعضای یک آرایه ، از چپ به راست تفسیر میشه .

درسته که اعضاء آرایه هم از چپ به راست وارد میشه، ولی این این مثالی که بررسی می کردیم در مورد ترتیب اعضاء آرایه نبود، ترتیب ابعاد آرایه بود.
چیزی که فکر می کردید اشتباه نیست، فقط نوع آرایه رو درست تفسیر نکردید. مثلا در مورد []int نوع آرایه []int است و اعضاء اون int هستند.
با فرضا در مورد [][]int نوع آرایه [][]int است و اعضاء اون []int هستند.
برای مشخص کردن اعضاء چیزی که حذف میشه آخرین آرایه نیست. اولین بعد ئه، از سمت چپ به راست.
میشه نرم افزار سیستمی را توی سی شارپ نوشت؟ اگه میشه ، چقدر سختی داره؟ اگه بازم میشه ، منابعش را میتونین بدین؟
ممنون
نه. تا حالا هم جایی ندیدم که تلاشی هم برای انجامش شده باشه. سختی اش به کنار، از نظر فنی NET. و CLR در لایه سیستمی برنامه اجرا نمی کنند، برنامه شما داخل ماشین مجازی داره اجرا میشه.
از طرف دیگه دسترسی مستقیم به منابع سیستم چیزی نیست که در ذات #C و زبان های NET. باشه، #C به منابع داخل NET. هم دسترسی مستقیم نداره چه برسه به منابع سیستم.
#C میتونه یک پوسته مناسب برای ارتباط با کاربر باشه ولی هسته نرم افزار سیستمی رو قاعدتا نمیشه با NET. نوشت.
نرم افزار های سیستمی معمولا با ++C/C نوشته میشن. منظور C++ CLI نیست ها.
در نظر بگیرید که اینها محدودیت های زبان #C نیست، محدودیت های NET. و کامپایلر ئه. چطور که کامپایلر های موجود برای ++C باعث شده همچین توانایی ای داشته باشه.
ممکنه یه روزی یک کامپایلر و پلتفرمی برای #C طراحی بشه که نه ماشین مجازی داشته باشه و نه این محدودیت ها رو.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
درسته که اعضاء آرایه هم از چپ به راست وارد میشه، ولی این این مثالی که بررسی می کردیم در مورد ترتیب اعضاء آرایه نبود، ترتیب ابعاد آرایه بود.
چیزی که فکر می کردید اشتباه نیست، فقط نوع آرایه رو درست تفسیر نکردید. مثلا در مورد []int نوع آرایه []int است و اعضاء اون int هستند.
با فرضا در مورد [][]int نوع آرایه [][]int است و اعضاء اون []int هستند.
برای مشخص کردن اعضاء چیزی که حذف میشه آخرین آرایه نیست. اولین بعد ئه، از سمت چپ به راست.

نه. تا حالا هم جایی ندیدم که تلاشی هم برای انجامش شده باشه. سختی اش به کنار، از نظر فنی NET. و CLR در لایه سیستمی برنامه اجرا نمی کنند، برنامه شما داخل ماشین مجازی داره اجرا میشه.
از طرف دیگه دسترسی مستقیم به منابع سیستم چیزی نیست که در ذات #C و زبان های NET. باشه، #C به منابع داخل NET. هم دسترسی مستقیم نداره چه برسه به منابع سیستم.
#C میتونه یک پوسته مناسب برای ارتباط با کاربر باشه ولی هسته نرم افزار سیستمی رو قاعدتا نمیشه با NET. نوشت.
نرم افزار های سیستمی معمولا با ++C/C نوشته میشن. منظور C++ CLI نیست ها.
در نظر بگیرید که اینها محدودیت های زبان #C نیست، محدودیت های NET. و کامپایلر ئه. چطور که کامپایلر های موجود برای ++C باعث شده همچین توانایی ای داشته باشه.
ممکنه یه روزی یک کامپایلر و پلتفرمی برای #C طراحی بشه که نه ماشین مجازی داشته باشه و نه این محدودیت ها رو.

آها خیلی ممنون
پس اینا محدودیت های دات نت هستن . منظورتون کلِ دات نت هست یا فقط net framework. هست؟
منظورم اینه که با net core. هم نمیشه برنامه ی سطح سیستمی با سی شارپ نوشت؟
توی خود ویندوز هم جوری دات نت را طراحی نکردن که حداقل کارایی سی پلاس پلاس را داشته باشه؟! چون هم سیستم عامل و هم سی شارپ و دات نت را خود مایکروسافت طراحی کرد دیگه .
 

the_king

مدیرکل انجمن
آها خیلی ممنون
پس اینا محدودیت های دات نت هستن . منظورتون کلِ دات نت هست یا فقط net framework. هست؟
منظورم اینه که با net core. هم نمیشه برنامه ی سطح سیستمی با سی شارپ نوشت؟

فرقی نمی کنه، شما چه با NET Framework کار کنید و چه NET Core. و چه Mono و ... همون CLI پیاده سازی شده و ماشین مجازی دارن.
خیلی از کد ها رو طوری می نویسند که با همه این پیاده سازی های سازگار باشند، اینطوری نیست که وقتی با NET. Core کار می کنید یهو همه چی متحول بشه و طور دیگه ای باشه.

توی خود ویندوز هم جوری دات نت را طراحی نکردن که حداقل کارایی سی پلاس پلاس را داشته باشه؟! چون هم سیستم عامل و هم سی شارپ و دات نت را خود مایکروسافت طراحی کرد دیگه .
این کارایی نیست، کاربرد های متفاوت دارن. کارد میوه خوری با کارد آشپزخونه و کارد پرتابی هر کدوم کارکرد مشخصی دارند و جای هم قابل استفاده نیستند، حتی اگه سازنده شون یک کارخونه باشه.
مثلا سرعت توسعه و طراحی در زبانی مثل #C بصورت محسوسی سریعتر از زبان قدیمی تری مثل ++C ئه. مدیریت منابعش ساده تره، رفع اشکالش راحت تره و ساختار بهتری داره.
زبانی که برای طراحی نرم افزارهای عمومی و همه منظوره طراحی شده قرار نیست برای هر کاربرد تخصصی ای مناسب باشه.
کاربرد ها کاملا متفاوته. مثل اینه که بگید مرسدس بنز یا رنو که ماشین مسابقه ای فرمول 1 هم طراحی میکنه، چرا خودرو های سواری داخل شهری اش رو همونطور طراحی نمی کنه که بشه تو پیست فرمول 1 باهاشون مسابقه داد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون از جوابتون.
بعد اینکه استاد به نظرتون برای بکاپ گیری ، درایوهای فلشی که فرمت ntfs دارن را (توی لیست درایوهای نرم افزار) قرار بدم؟
چون میگم کاربر ممکنه توی کامپیوتر خودش ، ازش بکاپ بگیره اما اون فلش رو ببره توی یه سیستم دیگه و اونجا تغییراتی بده اما اون کامپیوتر ، سرویس بکاپ vss اش فعال نباشه و موقع on write ، بکاپی ازش نگیره و بکاپ خراب بشه . البته اینکه سرویس vss ای غیر فعال باشه ، خیلی کم پیش میاد چون بصورت پیش فرض ، موقع نصب ویندوز ، فعاله.
اصلا حدسم درسته؟
با این حال ، شما چی پیشنهاد میدین؟ به نظرتون درایوهای قابل حملی که فرمت ntfs دارن رو اضافه کنم؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
درایوهای usb (حتی اگه ntfs هم باشن) ، در properties شون اصلا سربرگ previous version رو ندارن !
نه پادویش و نه این برنامه ام ، نمیتونن ازش بکاپی تهیه کنن .
چرا؟ بخاطر همونی هه که شاید در سیستم دیگه ای که این فلش متصل میشه ، سرویس vss غیر فعال باشه و همونجا تغییراتی در فلش داده باشن و بنابراین سرویس و بکاپ ، موقع on write نتونه تغییرات را در بکاپِ فلش اِعمال کنه و بکاپ خراب بشه؟ واسه همین قابلیت بکاپ را از درایوهای قابل حمل ، حذف کردن؟

-------------------------------------------------------

بعد اینکه به نظرتون این قابلیت رو بذارم که در صورتی که بکاپ نتونست تهیه کنه و تهیه نکردنش ، ممکنه بخاطرِ غیر فعال بودن سرویس vss طرف بوده باشه (یا کلا مشکلات مربوط به سرویس vss) را از توی برنامه ، سرویس vss کاربر را فعال کنم؟
پادویش که با سرویس vss کاری نداره و همه ی تنظیمات (فعال بودن یا نبودن و ...) را به کاربر سپرده.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا