diff --git a/standard/attributes.md b/standard/attributes.md index 758623ca5..67e45027b 100644 --- a/standard/attributes.md +++ b/standard/attributes.md @@ -496,6 +496,7 @@ A number of attributes affect the language in some way. These attributes include - `System.Runtime.CompilerServices.AsyncMethodBuilderAttribute` ([§23.5.5](attributes.md#2355-the-asyncmethodbuilder-attribute)), which is used to establish a task builder for an async method. - `System.Runtime.CompilerServices.CallerLineNumberAttribute` ([§23.5.6.2](attributes.md#23562-the-callerlinenumber-attribute)), `System.Runtime.CompilerServices.CallerFilePathAttribute` ([§23.5.6.3](attributes.md#23563-the-callerfilepath-attribute)), and `System.Runtime.CompilerServices.CallerMemberNameAttribute` ([§23.5.6.4](attributes.md#23564-the-callermembername-attribute)), which are used to supply information about the calling context to optional parameters. - `System.Runtime.CompilerServices.EnumeratorCancellationAttribute` ([§23.5.8](attributes.md#2358-the-enumeratorcancellation-attribute)), which is used to specify parameter for the cancellation token in an asynchronous iterator. +- `System.Runtime.CompilerServices.ModuleInitializer` (§module-init-attr), which is used to mark a method as a module initializer. The Nullable static analysis attributes ([§23.5.7](attributes.md#2357-code-analysis-attributes)) can improve the correctness of warnings generated for nullabilities and null states ([§8.9.5](types.md#895-nullabilities-and-null-states)). @@ -1099,6 +1100,22 @@ The iterator won’t have access to the `CancellationToken` argument for `GetAsy > > *end example* +### §module-init-attr The ModuleInitializer attribute + +The attribute `ModuleInitializer` is used to mark a method as a ***module initializer***. Such a method is called during initialization of the containing module. A module may have multiple initializers, which are called in an implementation-defined order. + +There are no limitations on what code is permitted in a module initializer. + +A module initializer shall have the following characteristics: + +- The *method_modifier* `static`. +- No *parameter_list*. +- A *return_type* of `void`. +- No *type_parameter_list*. +- Not be declared inside a *class_declaration* having a *type_parameter_list*. +- Be accessible from the containing module (that is, have an access modifier `internal` or `public`). +- Not be a local function. + ## 23.6 Attributes for interoperation For interoperation with other languages, an indexer may be implemented using indexed properties. If no `IndexerName` attribute is present for an indexer, then the name `Item` is used by default. The `IndexerName` attribute enables a developer to override this default and specify a different name. diff --git a/standard/portability-issues.md b/standard/portability-issues.md index 40f1f9eb8..0a32b8dd2 100644 --- a/standard/portability-issues.md +++ b/standard/portability-issues.md @@ -44,6 +44,7 @@ A conforming implementation is required to document its choice of behavior in ea 1. The impact of thread termination when a thread has no handler for an exception, and the thread is itself terminated. ([§13.10.6](statements.md#13106-the-throw-statement)) 1. The mechanism by which linkage to an external method is achieved. ([§15.6.8](classes.md#1568-external-methods)) 1. The impact of thread termination when no matching `catch` clause is found for an exception and the code that initially started that thread is reached. ([§22.4](exceptions.md#224-how-exceptions-are-handled)). +1. The order of execution of module initializers in a module (§module-init-attr). 1. An execution environment may provide additional attributes that affect the execution of a C# program. ([§23.5.1](attributes.md#2351-general)) 1. The mappings between pointers and integers. ([§24.5.1](unsafe-code.md#2451-general)) 1. The effect of applying the unary `*` operator to a `null` pointer. ([§24.6.2](unsafe-code.md#2462-pointer-indirection)) diff --git a/standard/standard-library.md b/standard/standard-library.md index 77bd8abb4..8c9ffb45b 100644 --- a/standard/standard-library.md +++ b/standard/standard-library.md @@ -816,6 +816,12 @@ namespace System.Runtime.CompilerServices void OnCompleted(Action continuation); } + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public sealed class ModuleInitializerAttribute : Attribute + { + public ModuleInitializerAttribute() { } + } + public readonly struct TaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { @@ -1367,6 +1373,7 @@ The following library types are referenced in this specification. The full names - `global::System.Runtime.CompilerServices.ICriticalNotifyCompletion` - `global::System.Runtime.CompilerServices.IndexerNameAttribute` - `global::System.Runtime.CompilerServices.INotifyCompletion` +- `global::System.Runtime.CompilerServices.ModuleInitializerAttribute` - `global::System.Runtime.CompilerServices.TaskAwaiter` - `global::System.Runtime.CompilerServices.TaskAwaiter` - `global::System.Runtime.CompilerServices.ValueTaskAwaiter`