- منحصربفرد و immutable (غیرقابل تغییر) هستند.
- همانند رشتهها میتوان از آنها به عنوان کلیدی برای پراپرتیها یک شیء استفاده کرد.
var myIterable = {} myIterable[Symbol.iterator] = function* () { yield 1; yield 2; yield 3; };
for (let item of myIterable) { console.log(item); }
let list = [4, 5, 6]; for (let i in list) { console.log(i); // "0", "1", "2", } for (let i of list) { console.log(i); // "4", "5", "6"
let numbers = [1, 2, 3]; for (let num of numbers) { console.log(num); }
var numbers = [1, 2, 3]; for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) { var num = numbers_1[_i]; console.log(num); } //# sourceMappingURL=app.js.map
روش تعریف خواص سفارشی MSBuild در پروژهی Source Generator
در مثال همین سری، به پوشهی NotifyPropertyChangedGenerator مراجعه کرده و فایل جدید NotifyPropertyChangedGenerator.props را با محتوای زیر به آن اضافه میکنیم:
<Project> <ItemGroup> <CompilerVisibleProperty Include="SourceGenerator_CustomRootNamespace"/> </ItemGroup> </Project>
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <!-- Generates a package at build --> <IncludeBuildOutput>false</IncludeBuildOutput> <!-- Do not include the generator as a lib dependency --> </PropertyGroup> <ItemGroup> <!-- Package the generator in the analyzer directory of the nuget package --> <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false"/> <!-- Package the props file --> <None Include="NotifyPropertyChangedGenerator.props" Pack="true" PackagePath="build" Visible="true"/> </ItemGroup> </Project>
یک نکتهی مهم! اگر بخواهیم مستقیما از پروژهی source generator خود مثلا در پروژهی NotifyPropertyChangedGenerator.Demo این سری همانند قبل استفاده کنیم، تنظیمات ذکر شدهی در فایل props. فوق، در آن قابل دسترسی نخواهند بود و با پروسهی build یکی نمیشوند. تنظیماتی که تا اینجا ذکر شدند، فقط مخصوص بستهی نیوگت نهایی است. برای استفادهی مستقیم از آنها در پروژهی Demo، نیاز است یکبار دیگر محتویات props. تولید کنندهی کد را داخل فایل csproj. پروژهی Demo، تعریف کرد. یا میتوان از روش استفاده از فایل ویژهی Directory.Build.props و قابلیتهای ارثبری آن استفاده کرد. یعنی یک فایل Directory.Build.props را در بالاترین سطح ممکن قرار داد و CompilerVisiblePropertyها را در آن تعریف کرد تا در تمام پروژههای برنامه قابل دسترسی شوند.
روش تعریف خواص سفارشی MSBuild در پروژهی استفاده کننده از Source Generator
در مثال این سری چون از بستهی نیوگت تولید کنندهی کد استفاده نمیکنیم، نیاز است خاصیت سفارشی تعریف شده را یکبار دیگر داخل فایل csproj. پروژهی Demo تعریف کنیم. پس از آن میتوان این خاصیت را در قسمت PropertyGroup مقدار دهی کرد:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <SourceGenerator_CustomRootNamespace>ThisIsTest</SourceGenerator_CustomRootNamespace> </PropertyGroup> <ItemGroup> <CompilerVisibleProperty Include="SourceGenerator_CustomRootNamespace"/> </ItemGroup> </Project>
روش دسترسی به مقدار خاصیت سفارشی MSBuild در پروژهی Source Generator
پس از این مقدمات، خواص عمومی MSBuild از طریق خاصیت AnalyzerConfigOptions.GlobalOptions و متد TryGetValue آن با فرمول زیر قابل دسترسی هستند. قسمت build_property ثابت بوده و جزو موارد توکار MSBuild است:
internal static class SourceGeneratorContextExtensions { public static string GetMSBuildProperty( this GeneratorExecutionContext context, string property, string defaultValue = "") { return !context.AnalyzerConfigOptions.GlobalOptions.TryGetValue($"build_property.{property}", out var value) ? defaultValue : value; } }
[Generator] public class NotifyPropertyChangedGenerator : ISourceGenerator { public void Initialize(GeneratorInitializationContext context) { } public void Execute(GeneratorExecutionContext context) { var customRootNamespace = context.GetMSBuildProperty("SourceGenerator_CustomRootNamespace", "Test");
معرفی خاصیت ویژهی AdditionalFiles
تا اینجا روش تعریف یک خاصیت جدید MSBuild و روش دسترسی به آنرا بررسی کردیم. خاصیت توکاری به نام AdditionalFiles نیز در MSBuild تعریف شدهاست که در پروژههای Source Generator جهت دسترسی به فایلها و محتوای آنها قابل استفاده است. برای نمونه میتوان در فایل csproj. پروژهی Demo تعریف زیر را ارائه کرد:
<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AdditionalFiles Include="file1.txt" Visible="false"/> </ItemGroup> </Project>
خاصیت Visible در اینجا مشخص میکند که آیا file1.txt در IDE، در کنار لیست سایر فایلها نمایش داده شود یا خیر.
امکان تعریف خواص سفارشی بر روی AdditionalFiles
فرض کنید علاقمندیم خاصیت ویژهای را به AdditionalFiles اضافه کنیم؛ برای مثال به نام SourceGenerator_EnableLogging مانند مثال زیر:
<Project Sdk="Microsoft.NET.Sdk"> <ItemGroup> <AdditionalFiles Include="file2.txt" SourceGenerator_EnableLogging="true" Visible="false"/> </ItemGroup> </Project>
الف) فایل NotifyPropertyChangedGenerator.props تعریف شده را به صورت زیر تکمیل میکنیم:
<Project> <ItemGroup> <CompilerVisibleProperty Include="SourceGenerator_CustomRootNamespace"/> <CompilerVisibleProperty Include="SourceGenerator_EnableLogging"/> <CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceGenerator_EnableLogging"/> </ItemGroup> </Project>
ب) در فایل csproj. پروژهی Demo، از این خواص و متادیتاها استفاده میکنیم:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <SourceGenerator_EnableLogging>true</SourceGenerator_EnableLogging> </PropertyGroup> <ItemGroup> <CompilerVisibleProperty Include="SourceGenerator_EnableLogging"/> <CompilerVisibleItemMetadata Include="AdditionalFiles" MetadataName="SourceGenerator_EnableLogging"/> <AdditionalFiles Include="file1.txt" Visible="false"/> <!-- logging will be controlled by default, or global value --> <AdditionalFiles Include="file2.txt" SourceGenerator_EnableLogging="true" Visible="false"/> <!-- always enable logging for this file --> <AdditionalFiles Include="file3.txt" SourceGenerator_EnableLogging="false" Visible="false"/> <!-- never enable logging for this file --> </ItemGroup> </Project>
ج) برای خواندن این خواص در پروژهی Source generator به صورت زیر عمل میشود:
internal static class SourceGeneratorContextExtensions { public static string GetAdditionalFilesOption( this GeneratorExecutionContext context, AdditionalText additionalText, string property, string defaultValue = "") { return !context.AnalyzerConfigOptions.GetOptions(additionalText) .TryGetValue($"build_metadata.AdditionalFiles.{property}", out var value) ? defaultValue : value; } }
- روش تامین AdditionalText این متد را نیز در مثال زیر مشاهده میکنید که حاصل ایجاد حلقهای بر روی context.AdditionalFilesهای دریافتی است:
[Generator] public class NotifyPropertyChangedGenerator : ISourceGenerator { public void Initialize(GeneratorInitializationContext context) { } public void Execute(GeneratorExecutionContext context) { var customRootNamespace = context.GetMSBuildProperty("SourceGenerator_CustomRootNamespace", "Test"); var globalLoggingSwitch = context.GetMSBuildProperty("SourceGenerator_EnableLogging", "false"); var emitLoggingGlobal = globalLoggingSwitch.Equals("true", StringComparison.OrdinalIgnoreCase); foreach (var file in context.AdditionalFiles) { var perFileLoggingSwitch = context.GetAdditionalFilesOption(file, "SourceGenerator_EnableLogging"); var emitLogging = string.IsNullOrWhiteSpace(perFileLoggingSwitch) ? emitLoggingGlobal // allow the user to override the global logging on a per-file basis : perFileLoggingSwitch.Equals("true", StringComparison.OrdinalIgnoreCase); // add the source with or without logging... }
کتابخانه AndroidAssetStudio
A web-based set of tools for generating graphics and other assets that would eventually be in an Android application's res/ directory. Demo
Currently available asset generators area available for:
- Launcher icons
- Action bar icons
- Notification icons
- Device-framed screenshots
- Simple nine-patches
------ Build started: Project: BlankCordovaApp4, Configuration: Debug Android ------ 1> GeneratedJavascript=scripts\index.js;scripts\index.js.map;scripts\platformOverrides.js;scripts\platformOverrides.js.map 1> D:\Project Dot Net\BlankCordovaApp4\BlankCordovaApp4>call "C:\Program Files (x86)\nodejs\"\nodevars.bat 1> Your environment has been set up for using Node.js 0.12.7 (ia32) and npm. 1> ------ Ensuring correct global installation of package from source package directory: C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 12.0\COMMON7\IDE\EXTENSIONS\MH2WEJOO.42Y\packages\vs-mda 1> ------ Name from source package.json: vs-mda 1> ------ Version from source package.json: 0.1.75 1> ------ Current globally installed version: 0.1.75 1> ------ Package already installed globally at correct version. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Deploy: 0 succeeded, 0 failed, 0 skipped ==========
We are thrilled to announce the highly anticipated .NET Conf 2024, a free, three-day virtual developer event celebrating the release of .NET 9. Co-organized by the .NET community and Microsoft, this annual tradition continues to grow, and we’re more excited than ever to bring you the latest innovations in .NET. Mark your calendars for November 12th to 14th, 2024, and prepare to be inspired by a wealth of knowledge, creativity, and community engagement.
CSS3 (~2009-2012):
Level 3 CSS specs as defined by the CSSWG. (immutable)
CSS4 (~2013-2018):
Essential features that were not part of CSS3 but are already a fundamental part of CSS.
CSS5 (~2019-2024):
Newer features whose adoption is steadily growing.
CSS6 (~2025+):
Early-stage features that are planned for future CSS.
The collection includes 14 different tools including a Json to Yaml and Yaml to Json converter, a JWT decoder, a Text compare tool, and more.
The full list includes:
- Converters
- Json <> Yaml
- Number Base
- Encoders / Decoders
- HTML
- URL
- Base64
- JWT Decoder
- Formatters
- Json
- Generators
- Hash (MD5, SHA1, SHA256, SHA512)
- UUID 1 and 4
- Lorem Ipsum
- Text
- Inspector & Case Converter
- Regex Tester
- Text Comparer
- Markdown Preview
- Graphic
- Color Blindness Simulator
- PNG / JPEG Compressor
Some of the tools will have wider appeal, for example, the text comparison tool would be useful for writers and solicitors alike, while the PNG/JPEG compressor could help webmasters. Expect more utilities to join the bundle in the future.
The collection is free, and can be accessed via GitHub here or free via the Microsoft Store.