قبل از اینکه از دامنه جدید استفاده کنند
... قرار نبود که اصلا تغییری باشد؛ مجبور شدیم (سطر اول مطلب جاری و یا اینجا) ... + به تمام کاربران ثبت نام شدهی سایت، ایمیل ارسال شده.
قبل از اینکه از دامنه جدید استفاده کنند
//... .AddIdentityServerAuthentication(options => { options.JwtValidationClockSkew = TimeSpan.Zero;
var sql = ctx.Artists.Where(a => a.Name == "name 1").ToQueryString();
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.LogTo(Console.WriteLine);
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.LogTo(message => Console.WriteLine(message));
1- یک کلاس معمولی تنها میتواند از یک کلاس Abstract ارث بری کند ولی همان کلاس میتواند از چندین Interface ارث ببرد.وضعیت فعلی: هنوز هم برقرار است. اما چون اینبار اینترفیسها هم میتوانند به همراه کد باشند، میتوان به multiple inheritance از طریق اینترفیسها نیز رسید. هنگامیکه پیاده سازیهای پیشفرض اینترفیسها فراخوانی میشوند، فراخوان باید نوع اینترفیس متناظر را هم دقیقا مشخص کند. این ویژگی، مشکل معروفی را به نام «diamond problem»، که در ارث بری چندگانهی از کلاسهای پایه در زبانهای دیگر وجود دارد، حل میکند: زمانیکه دو یا چند کلاس پایه، متد هم نامی را داشته باشند.
2- یک Interface فقط میتواند اعلان متدها و خصوصیتها را داشته باشد؛ اما یک کلاس Abstract علاوه بر آنها میتوانید متدها و خصوصیتهایی با کدهای کامل داشته باشد.وضعیت فعلی: دیگر اینطور نیست. اینترفیسها در C# 8.0 میتوانند به همراه «default implementation» هم باشند.
3- عناصر موجود در کلاس Abstract میتوانند مانند یک کلاس معمولی دارای سطح دسترسی باشند؛ ولی Interfaceها فاقد این امکان هستند.وضعیت فعلی: دیگر اینطور نیست. از زمان C# 8.0 به بعد، اعضای یک اینترفیس هم میتوانند دارای access modifiers باشند. حالت پیشفرض، public است. اما اکنون اینترفیسها میتوانند دارای اعضای private هم باشند که فقط داخل همان اینترفیس قابل دسترسی هستند. این مورد برای خواناتر کردن پیاده سازیهای پیشفرض متدها در اینترفیسها میتواند مفید باشد. در اینجا امکان تعریف اعضای protected نیز میسر است.
4- وقتی شما متدی را به کلاس Abstract اضافه میکنید، به طور خودکار به همه زیر کلاسها اعمال میشود؛ اما در Interface اگر متدی اضافه کنید باید در تمام زیر کلاسها آن را اعمال کنید .
5- کلاسهای Abstract مانند کلاسهای معمولی میتوانند دارای فیلد و عناصر دیگری (مثل ثابتها) باشند؛ در حالیکه یک Interface فاقد این امکان میباشد. همچنین کلاس abstract میتواند شامل سازنده باشد، اما اینترفیس نمیتواند.وضعیت فعلی: هنوز هم تا حدودی برقرار است. با تغییرات زبان #C، اکنون اینترفیسها میتوانند دارای فیلدها، سازندهها و تخریبگرهای استاتیک هم باشند. یک فیلد استاتیک، فیلدی است که مقدار آن متعلق به یک وهلهی خاص نیست (هنوز هم نمیتوان instance filed در اینجا داشت) و به اشتراک گذاشته میشود (دقیقا مانند فیلدهای استاتیک کلاسها عمل میکند).