From 7ea81f403022523b90cb659577b9a476123ab67d Mon Sep 17 00:00:00 2001 From: Petr Kulikov Date: Wed, 19 Dec 2018 16:03:51 +0100 Subject: [PATCH 01/14] Revised comparison relational operator articles (#9644) * Revised comparison relational operator articles * Fix xref link * Add note about behavior with NaN --- .../CSharp/greater-than-equal-operator_1.cs | 13 ------ .../CSharp/greater-than-operator_1.cs | 13 ------ .../CSharp/less-than-equal-operator_1.cs | 13 ------ .../CSharp/less-than-operator_1.cs | 13 ------ .../operators/equality-comparison-operator.md | 3 ++ .../operators/greater-than-equal-operator.md | 42 +++++++++++------- .../operators/greater-than-operator.md | 42 +++++++++++------- .../operators/less-than-equal-operator.md | 43 ++++++++++++------- .../operators/less-than-operator.md | 41 +++++++++++------- 9 files changed, 109 insertions(+), 114 deletions(-) delete mode 100644 docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-equal-operator_1.cs delete mode 100644 docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-operator_1.cs delete mode 100644 docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-equal-operator_1.cs delete mode 100644 docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-operator_1.cs diff --git a/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-equal-operator_1.cs b/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-equal-operator_1.cs deleted file mode 100644 index f96aac9933fd4..0000000000000 --- a/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-equal-operator_1.cs +++ /dev/null @@ -1,13 +0,0 @@ - class GTE - { - static void Main() - { - Console.WriteLine(1.1 >= 1); - Console.WriteLine(1.1 >= 1.1); - } - } - /* - Output: - True - True - */ \ No newline at end of file diff --git a/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-operator_1.cs b/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-operator_1.cs deleted file mode 100644 index 46513b7a0af82..0000000000000 --- a/docs/csharp/language-reference/operators/codesnippet/CSharp/greater-than-operator_1.cs +++ /dev/null @@ -1,13 +0,0 @@ - class GT - { - static void Main() - { - Console.WriteLine(1.1 > 1); - Console.WriteLine(1.1 > 1.1); - } - } - /* - Output: - True - False - */ \ No newline at end of file diff --git a/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-equal-operator_1.cs b/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-equal-operator_1.cs deleted file mode 100644 index 0964dab88a706..0000000000000 --- a/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-equal-operator_1.cs +++ /dev/null @@ -1,13 +0,0 @@ - class LTE - { - static void Main() - { - Console.WriteLine(1 <= 1.1); - Console.WriteLine(1.1 <= 1.1); - } - } - /* - Output: - True - True - */ \ No newline at end of file diff --git a/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-operator_1.cs b/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-operator_1.cs deleted file mode 100644 index fd5e6a60412b9..0000000000000 --- a/docs/csharp/language-reference/operators/codesnippet/CSharp/less-than-operator_1.cs +++ /dev/null @@ -1,13 +0,0 @@ - class LT - { - static void Main() - { - Console.WriteLine(1 < 1.1); - Console.WriteLine(1.1 < 1.1); - } - } - /* - Output: - True - False - */ \ No newline at end of file diff --git a/docs/csharp/language-reference/operators/equality-comparison-operator.md b/docs/csharp/language-reference/operators/equality-comparison-operator.md index f3df75947fa72..ff5350699ef11 100644 --- a/docs/csharp/language-reference/operators/equality-comparison-operator.md +++ b/docs/csharp/language-reference/operators/equality-comparison-operator.md @@ -19,6 +19,9 @@ Operands of the [built-in value types](../keywords/value-types-table.md) are equ [!code-csharp-interactive[value types equality](~/samples/snippets/csharp/language-reference/operators/EqualityAndNonEqualityExamples.cs#ValueTypesEquality)] +> [!NOTE] +> For relational operators `==`, `>`, `<`, `>=`, and `<=`, if any of the operands is not a number ( or ) the result of operation is `false`. That means that the `NaN` value is neither greater than, less than, nor equal to any other `double` (or `float`) value. For more information and examples, see the or reference article. + Two operands of the same [enum](../keywords/enum.md) type are equal if the corresponding values of the underlying integral type are equal. By default, the `==` operator is not defined for a user-defined [struct](../keywords/struct.md) type. A user-defined type can [overload](#operator-overloadability) the `==` operator. diff --git a/docs/csharp/language-reference/operators/greater-than-equal-operator.md b/docs/csharp/language-reference/operators/greater-than-equal-operator.md index ab9da42832c64..256b6e2bb2cbc 100644 --- a/docs/csharp/language-reference/operators/greater-than-equal-operator.md +++ b/docs/csharp/language-reference/operators/greater-than-equal-operator.md @@ -1,8 +1,7 @@ --- title: ">= Operator - C# Reference" ms.custom: seodec18 - -ms.date: 07/20/2015 +ms.date: 12/18/2018 f1_keywords: - ">=_CSharpKeyword" helpviewer_keywords: @@ -11,16 +10,29 @@ helpviewer_keywords: ms.assetid: 0db4dcaf-56a3-4884-a7ad-35f64978a58d --- # >= Operator (C# Reference) -All numeric and enumeration types define a "greater than or equal" relational operator, `>=` that returns `true` if the first operand is greater than or equal to the second, `false` otherwise. - -## Remarks - User-defined types can overload the `>=` operator. For more information, see [operator](../../../csharp/language-reference/keywords/operator.md). If `>=` is overloaded, [<=](../../../csharp/language-reference/operators/less-than-equal-operator.md) must also be overloaded. Operations on integral types are generally allowed on enumeration. - -## Example - [!code-csharp[csRefOperators#39](../../../csharp/language-reference/operators/codesnippet/CSharp/greater-than-equal-operator_1.cs)] - -## See Also - -- [C# Reference](../../../csharp/language-reference/index.md) -- [C# Programming Guide](../../../csharp/programming-guide/index.md) -- [C# Operators](../../../csharp/language-reference/operators/index.md) + +The "greater than or equal" relational operator `>=` returns `true` if its first operand is greater than or equal to its second operand, `false` otherwise. All numeric and enumeration types support the `>=` operator. For operands of the same [enum](../keywords/enum.md) type, the corresponding values of the underlying integral type are compared. + +> [!NOTE] +> For relational operators `==`, `>`, `<`, `>=`, and `<=`, if any of the operands is not a number ( or ) the result of operation is `false`. That means that the `NaN` value is neither greater than, less than, nor equal to any other `double` (or `float`) value. For more information and examples, see the or reference article. + +The following example demonstrates the usage of the `>=` operator: + +[!code-csharp-interactive[greater than or equal example](~/samples/snippets/csharp/language-reference/operators/GreaterAndLessOperatorsExamples.cs#GreaterOrEqual)] + +## Operator overloadability + +User-defined types can [overload](../keywords/operator.md) the `>=` operator. If a type overloads the "greater than or equal" operator `>=`, it must also overload the ["less than or equal" operator](less-than-equal-operator.md) `<=`. + +## C# language specification + +For more information, see the [Relational and type-testing operators](~/_csharplang/spec/expressions.md#relational-and-type-testing-operators) section of the [C# language specification](../language-specification/index.md). + +## See also + +- [C# Reference](../index.md) +- [C# Programming Guide](../../programming-guide/index.md) +- [C# Operators](index.md) +- [> Operator](greater-than-operator.md) +- [== Operator](equality-comparison-operator.md) +- diff --git a/docs/csharp/language-reference/operators/greater-than-operator.md b/docs/csharp/language-reference/operators/greater-than-operator.md index aee91143109c2..920906d99db1d 100644 --- a/docs/csharp/language-reference/operators/greater-than-operator.md +++ b/docs/csharp/language-reference/operators/greater-than-operator.md @@ -1,8 +1,7 @@ --- title: "> Operator - C# Reference" ms.custom: seodec18 - -ms.date: 07/20/2015 +ms.date: 12/18/2018 f1_keywords: - ">_CSharpKeyword" helpviewer_keywords: @@ -11,17 +10,28 @@ helpviewer_keywords: ms.assetid: 26d3cb69-9c0b-4cc5-858b-5be1abd6659d --- # > Operator (C# Reference) -All numeric and enumeration types define a "greater than" relational operator (`>`) that returns `true` if the first operand is greater than the second, `false` otherwise. - -## Remarks - User-defined types can overload the `>` operator (see [operator](../../../csharp/language-reference/keywords/operator.md)). If `>` is overloaded, [<](../../../csharp/language-reference/operators/less-than-operator.md) must also be overloaded. - -## Example - [!code-csharp[csRefOperators#29](../../../csharp/language-reference/operators/codesnippet/CSharp/greater-than-operator_1.cs)] - -## See Also - -- [C# Reference](../../../csharp/language-reference/index.md) -- [C# Programming Guide](../../../csharp/programming-guide/index.md) -- [C# Operators](../../../csharp/language-reference/operators/index.md) -- [explicit](../../../csharp/language-reference/keywords/explicit.md) + +The "greater than" relational operator `>` returns `true` if its first operand is greater than its second operand, `false` otherwise. All numeric and enumeration types support the `>` operator. For operands of the same [enum](../keywords/enum.md) type, the corresponding values of the underlying integral type are compared. + +> [!NOTE] +> For relational operators `==`, `>`, `<`, `>=`, and `<=`, if any of the operands is not a number ( or ) the result of operation is `false`. That means that the `NaN` value is neither greater than, less than, nor equal to any other `double` (or `float`) value. For more information and examples, see the or reference article. + +The following example demonstrates the usage of the `>` operator: + +[!code-csharp-interactive[greater than example](~/samples/snippets/csharp/language-reference/operators/GreaterAndLessOperatorsExamples.cs#Greater)] + +## Operator overloadability + +User-defined types can [overload](../keywords/operator.md) the `>` operator. If a type overloads the "greater than" operator `>`, it must also overload the ["less than" operator](less-than-operator.md) `<`. + +## C# language specification + +For more information, see the [Relational and type-testing operators](~/_csharplang/spec/expressions.md#relational-and-type-testing-operators) section of the [C# language specification](../language-specification/index.md). + +## See also + +- [C# Reference](../index.md) +- [C# Programming Guide](../../programming-guide/index.md) +- [C# Operators](index.md) +- [>= Operator](greater-than-equal-operator.md) +- diff --git a/docs/csharp/language-reference/operators/less-than-equal-operator.md b/docs/csharp/language-reference/operators/less-than-equal-operator.md index 71e41de92a60c..770d586ae7e30 100644 --- a/docs/csharp/language-reference/operators/less-than-equal-operator.md +++ b/docs/csharp/language-reference/operators/less-than-equal-operator.md @@ -1,8 +1,7 @@ --- title: "<= Operator - C# Reference" ms.custom: seodec18 - -ms.date: 07/20/2015 +ms.date: 12/18/2018 f1_keywords: - "<=_CSharpKeyword" helpviewer_keywords: @@ -11,17 +10,29 @@ helpviewer_keywords: ms.assetid: bb0caec9-d253-4105-b8bc-5252233251e4 --- # <= Operator (C# Reference) -All numeric and enumeration types define a "less than or equal" relational operator (`<=`) that returns `true` if the first operand is less than or equal to the second, `false` otherwise. - -## Remarks - User-defined types can overload the `<=` operator. For more information, see [operator](../../../csharp/language-reference/keywords/operator.md). If `<=` is overloaded, [>=](../../../csharp/language-reference/operators/greater-than-equal-operator.md) must also be overloaded. Operations on integral types are generally allowed on enumeration. - -## Example - [!code-csharp[csRefOperators#32](../../../csharp/language-reference/operators/codesnippet/CSharp/less-than-equal-operator_1.cs)] - -## See Also - -- [C# Reference](../../../csharp/language-reference/index.md) -- [C# Programming Guide](../../../csharp/programming-guide/index.md) -- [C# Operators](../../../csharp/language-reference/operators/index.md) -- [explicit](../../../csharp/language-reference/keywords/explicit.md) + +The "less than or equal" relational operator `<=` returns `true` if its first operand is less than or equal to its second operand, `false` otherwise. All numeric and enumeration types support the `<=` operator. For operands of the same [enum](../keywords/enum.md) type, the corresponding values of the underlying integral type are compared. + +> [!NOTE] +> For relational operators `==`, `>`, `<`, `>=`, and `<=`, if any of the operands is not a number ( or ) the result of operation is `false`. That means that the `NaN` value is neither greater than, less than, nor equal to any other `double` (or `float`) value. For more information and examples, see the or reference article. + +The following example demonstrates the usage of the `<=` operator: + +[!code-csharp-interactive[less than or equal example](~/samples/snippets/csharp/language-reference/operators/GreaterAndLessOperatorsExamples.cs#LessOrEqual)] + +## Operator overloadability + +User-defined types can [overload](../keywords/operator.md) the `<=` operator. If a type overloads the "less than or equal" operator `<=`, it must also overload the ["greater than or equal" operator](greater-than-equal-operator.md) `>=`. + +## C# language specification + +For more information, see the [Relational and type-testing operators](~/_csharplang/spec/expressions.md#relational-and-type-testing-operators) section of the [C# language specification](../language-specification/index.md). + +## See also + +- [C# Reference](../index.md) +- [C# Programming Guide](../../programming-guide/index.md) +- [C# Operators](index.md) +- [< Operator](less-than-operator.md) +- [== Operator](equality-comparison-operator.md) +- diff --git a/docs/csharp/language-reference/operators/less-than-operator.md b/docs/csharp/language-reference/operators/less-than-operator.md index 55b43bbb68b87..6881760a799d3 100644 --- a/docs/csharp/language-reference/operators/less-than-operator.md +++ b/docs/csharp/language-reference/operators/less-than-operator.md @@ -1,8 +1,7 @@ --- title: "< Operator - C# Reference" ms.custom: seodec18 - -ms.date: 07/20/2015 +ms.date: 12/18/2018 f1_keywords: - "<_CSharpKeyword" helpviewer_keywords: @@ -11,16 +10,28 @@ helpviewer_keywords: ms.assetid: 38cb91e6-79a6-48ec-9c1e-7b71fd8d2b41 --- # < Operator (C# Reference) -All numeric and enumeration types define a "less than" relational operator (`<`) that returns `true` if the first operand is less than the second, `false` otherwise. - -## Remarks - User-defined types can overload the `<` operator (see [operator](../../../csharp/language-reference/keywords/operator.md)). If `<` is overloaded, [>](../../../csharp/language-reference/operators/greater-than-operator.md) must also be overloaded. - -## Example - [!code-csharp[csRefOperators#24](../../../csharp/language-reference/operators/codesnippet/CSharp/less-than-operator_1.cs)] - -## See Also - -- [C# Reference](../../../csharp/language-reference/index.md) -- [C# Programming Guide](../../../csharp/programming-guide/index.md) -- [C# Operators](../../../csharp/language-reference/operators/index.md) + +The "less than" relational operator `<` returns `true` if its first operand is less than its second operand, `false` otherwise. All numeric and enumeration types support the `<` operator. For operands of the same [enum](../keywords/enum.md) type, the corresponding values of the underlying integral type are compared. + +> [!NOTE] +> For relational operators `==`, `>`, `<`, `>=`, and `<=`, if any of the operands is not a number ( or ) the result of operation is `false`. That means that the `NaN` value is neither greater than, less than, nor equal to any other `double` (or `float`) value. For more information and examples, see the or reference article. + +The following example demonstrates the usage of the `<` operator: + +[!code-csharp-interactive[less than example](~/samples/snippets/csharp/language-reference/operators/GreaterAndLessOperatorsExamples.cs#Less)] + +## Operator overloadability + +User-defined types can [overload](../keywords/operator.md) the `<` operator. If a type overloads the "less than" operator `<`, it must also overload the ["greater than" operator](greater-than-operator.md) `>`. + +## C# language specification + +For more information, see the [Relational and type-testing operators](~/_csharplang/spec/expressions.md#relational-and-type-testing-operators) section of the [C# language specification](../language-specification/index.md). + +## See also + +- [C# Reference](../index.md) +- [C# Programming Guide](../../programming-guide/index.md) +- [C# Operators](index.md) +- [<= Operator](less-than-equal-operator.md) +- From 7092595ef093aa53a1bc4f701a56fa5d0529cc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E4=B9=9D=E9=BC=8E?= <109224573@qq.com> Date: Thu, 20 Dec 2018 00:02:36 +0800 Subject: [PATCH 02/14] Fix md table (#9668) --- docs/fsharp/language-reference/casting-and-conversions.md | 3 ++- docs/fsharp/language-reference/lists.md | 3 ++- .../language-reference/source-line-file-path-identifiers.md | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/fsharp/language-reference/casting-and-conversions.md b/docs/fsharp/language-reference/casting-and-conversions.md index 57e934b2a27e7..28dc62d2d374b 100644 --- a/docs/fsharp/language-reference/casting-and-conversions.md +++ b/docs/fsharp/language-reference/casting-and-conversions.md @@ -34,6 +34,7 @@ The following table shows conversion operators defined in F#. |`decimal`|Convert to `System.Decimal`.| |`char`|Convert to `System.Char`, a Unicode character.| |`enum`|Convert to an enumerated type.| + In addition to built-in primitive types, you can use these operators with types that implement `op_Explicit` or `op_Implicit` methods with appropriate signatures. For example, the `int` conversion operator works with any type that provides a static method `op_Explicit` that takes the type as a parameter and returns `int`. As a special exception to the general rule that methods cannot be overloaded by return type, you can do this for `op_Explicit` and `op_Implicit`. ## Enumerated Types @@ -111,4 +112,4 @@ For more information about type tests, see [Match Expressions](match-Expressions ## See also -- [F# Language Reference](index.md) \ No newline at end of file +- [F# Language Reference](index.md) diff --git a/docs/fsharp/language-reference/lists.md b/docs/fsharp/language-reference/lists.md index fe6e81bc743ae..a5c3c9e24f1df 100644 --- a/docs/fsharp/language-reference/lists.md +++ b/docs/fsharp/language-reference/lists.md @@ -64,6 +64,7 @@ The list type supports the following properties: |[Item](https://msdn.microsoft.com/library/bdb2553a-0e54-4ff8-baed-ab1aac8f5dae)|`'T`|The element at the specified index (zero-based).| |[Length](https://msdn.microsoft.com/library/25f715c8-9daa-4c4d-a6c7-26772f9dab4d)|`int`|The number of elements.| |[Tail](https://msdn.microsoft.com/library/2a6f8eb9-dc32-41aa-8b62-2baffaface91)|`'T list`|The list without the first element.| + Following are some examples of using these properties. [!code-fsharp[Main](../../../samples/snippets/fsharp/lang-ref-1/snippet1307.fs)] @@ -441,4 +442,4 @@ For information about additional operations on lists, see the library reference - [F# Types](fsharp-types.md) - [Sequences](sequences.md) - [Arrays](arrays.md) -- [Options](options.md) \ No newline at end of file +- [Options](options.md) diff --git a/docs/fsharp/language-reference/source-line-file-path-identifiers.md b/docs/fsharp/language-reference/source-line-file-path-identifiers.md index 5fde510d0daa5..6bde99b0c0bf5 100644 --- a/docs/fsharp/language-reference/source-line-file-path-identifiers.md +++ b/docs/fsharp/language-reference/source-line-file-path-identifiers.md @@ -26,6 +26,7 @@ The following table summarizes the source line, file, and path identifiers that |`__LINE__`|Evaluates to the current line number, considering `#line` directives.| |`__SOURCE_DIRECTORY__`|Evaluates to the current full path of the source directory, considering `#line` directives.| |`__SOURCE_FILE__`|Evaluates to the current source file name and its path, considering `#line` directives.| + For more information about the `#line` directive, see [Compiler Directives](compiler-directives.md). ## Example @@ -45,4 +46,4 @@ Source File: C:\Users\username\Documents\Visual Studio 2017\Projects\SourceInfo\ ## See also - [Compiler Directives](compiler-directives.md) -- [F# Language Reference](index.md) \ No newline at end of file +- [F# Language Reference](index.md) From b1d0e7fd3aa193e292c3acab8fd7d528159528c3 Mon Sep 17 00:00:00 2001 From: Fyers Date: Wed, 19 Dec 2018 17:15:44 +0100 Subject: [PATCH 03/14] Typo (#9674) --- .../programming-guide/concepts/attributes/attributeusage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/csharp/programming-guide/concepts/attributes/attributeusage.md b/docs/csharp/programming-guide/concepts/attributes/attributeusage.md index beb0bdc37210e..fd903741a7ddd 100644 --- a/docs/csharp/programming-guide/concepts/attributes/attributeusage.md +++ b/docs/csharp/programming-guide/concepts/attributes/attributeusage.md @@ -6,7 +6,7 @@ ms.date: 04/25/2018 Determines how a custom attribute class can be used. is an attribute you apply to custom attribute definitions. The `AttributeUsage` attribute enables you to control: -- Which program elements attribute may be applied to. Unless you restrict is usage, an attribute may be applied to any of the following program elements: +- Which program elements attribute may be applied to. Unless you restrict its usage, an attribute may be applied to any of the following program elements: - assembly - module - field From 59028ad432fe85a0ea98b9aed33e483d2b9326d8 Mon Sep 17 00:00:00 2001 From: Ron Petrusha Date: Wed, 19 Dec 2018 08:23:50 -0800 Subject: [PATCH 04/14] Changed 'allocating' to 'waiting' (#9647) --- .../media/backgroundworkstn.png | Bin 4614 -> 14053 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/standard/garbage-collection/media/backgroundworkstn.png b/docs/standard/garbage-collection/media/backgroundworkstn.png index 994ac160ee0cc53fdc4ee4a5b46b7914129cbd4e..fda88c20081cc0cf9850def32bf8b3e3d896586c 100644 GIT binary patch literal 14053 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 q7X*Qg8moU)}LYk literal 4614 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 Date: Wed, 19 Dec 2018 17:25:14 +0100 Subject: [PATCH 05/14] Correct comparison and minor cleanup in example (#9672) --- .../mef/attributed-programming-model-overview-mef.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/framework/mef/attributed-programming-model-overview-mef.md b/docs/framework/mef/attributed-programming-model-overview-mef.md index 515b56956b0ab..0341124a28f33 100644 --- a/docs/framework/mef/attributed-programming-model-overview-mef.md +++ b/docs/framework/mef/attributed-programming-model-overview-mef.md @@ -542,7 +542,7 @@ Public Class User logger = Nothing For Each Plugin As Lazy(Of IPlugin, IPluginMetadata) In plugins - If (Plugin.Metadata.Name = "Logger") Then + If Plugin.Metadata.Name = "Logger" Then logger = Plugin.Value End If Next @@ -558,13 +558,14 @@ public class User [ImportMany] public IEnumerable> plugins; - public IPlugin InstantiateLogger () + public IPlugin InstantiateLogger() { IPlugin logger = null; foreach (Lazy plugin in plugins) { - if (plugin.Metadata.Name = "Logger") logger = plugin.Value; + if (plugin.Metadata.Name == "Logger") + logger = plugin.Value; } return logger; } From 25eff3fc58bb1272d46df4f7d7d83bde24cde44c Mon Sep 17 00:00:00 2001 From: Dave Lowe Date: Wed, 19 Dec 2018 16:25:54 +0000 Subject: [PATCH 06/14] Added mutually recursive records example to records documentation (#9664) * Added Mutually Recursive Records example to records documentation * Update docs/fsharp/language-reference/records.md Co-Authored-By: iwasdavid * Update docs/fsharp/language-reference/records.md Co-Authored-By: iwasdavid * Update docs/fsharp/language-reference/records.md Co-Authored-By: iwasdavid * Update docs/fsharp/language-reference/records.md Co-Authored-By: iwasdavid * Removed bad code example that wouldn't compile * Removed white space --- docs/fsharp/language-reference/records.md | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/fsharp/language-reference/records.md b/docs/fsharp/language-reference/records.md index edf9490c2ae31..4c17acfe23c16 100644 --- a/docs/fsharp/language-reference/records.md +++ b/docs/fsharp/language-reference/records.md @@ -84,6 +84,29 @@ let defaultRecord2 = { Field1 = 1; Field2 = 25 } let rr3 = { defaultRecord1 with Field2 = 42 } ``` +## Creating Mutually Recursive Records + +Sometime when creating a record, you may want to have it depend on another type that you would like to define afterwards. This is a compile error unless you define the record types to be mutually recursive. + +Defining mutually recursive records is done with the `and` keyword. This lets you link 2 or more record types together. + +For example, the following code defines a `Person` and `Address` type as mutually recursive: + +```fsharp +// Create a Person type and use the Address type that is not defined +type Person = + { Name: string + Age: int + Address: Address } +// Define the Address type which is used in the Person record +and Address = + { Line1: string + Line2: string + PostCode: string } +``` + +If you were to define the previous example without the `and` keyword, then it would not compile. The `and` keyword is required for mutually recursive definitions. + ## Pattern Matching with Records Records can be used with pattern matching. You can specify some fields explicitly and provide variables for other fields that will be assigned when a match occurs. The following code example illustrates this. @@ -122,4 +145,4 @@ If you need reference equality for records, add the attribute `[ Date: Wed, 19 Dec 2018 11:27:54 -0500 Subject: [PATCH 07/14] Add description of += being used to subscribe to an event (#9663) --- docs/standard/delegates-lambdas.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/standard/delegates-lambdas.md b/docs/standard/delegates-lambdas.md index a3c463419560f..d9fcaa1b680da 100644 --- a/docs/standard/delegates-lambdas.md +++ b/docs/standard/delegates-lambdas.md @@ -149,6 +149,8 @@ public MainWindow() } ``` +The `+=` operator in this context is used to subscribe to an [event](../../docs/csharp/language-reference/keywords/event.md). For more information, see [How to: Subscribe to and Unsubscribe from Events](../../docs/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events.md). + ## Further reading and resources * [Delegates](../../docs/csharp/programming-guide/delegates/index.md) From 70558bb9fb2b1564c7bf16ac6a06b4de7d758d72 Mon Sep 17 00:00:00 2001 From: Genevieve Warren Date: Wed, 19 Dec 2018 09:50:17 -0800 Subject: [PATCH 08/14] fixes #7922 by adding info about notifications option (#9640) --- .../disable-dpi-awareness-visual-studio.md | 14 ++++++++++++-- .../notifications-option.png | Bin 0 -> 27642 bytes 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 docs/framework/winforms/media/disable-dpi-awareness-visual-studio/notifications-option.png diff --git a/docs/framework/winforms/disable-dpi-awareness-visual-studio.md b/docs/framework/winforms/disable-dpi-awareness-visual-studio.md index 8149381bd8ade..62c8937a3be7e 100644 --- a/docs/framework/winforms/disable-dpi-awareness-visual-studio.md +++ b/docs/framework/winforms/disable-dpi-awareness-visual-studio.md @@ -1,7 +1,7 @@ --- title: Disable DPI-awareness in Visual Studio description: Discusses the limitations of Windows Forms Designer on HDPI monitors, and how to run Visual Studio as a DPI-unaware process. -ms.date: 08/14/2018 +ms.date: 12/17/2018 ms.prod: visual-studio-dev15 ms.technology: vs-ide-designers author: gewarren @@ -23,7 +23,7 @@ In Visual Studio 2017 version 15.8 and later, when you open a form in the **Wind The message reads **Scaling on your main display is set to 200% (192 dpi). This might cause rendering problems in the designer window.** -If you aren't working in the designer and don't need to adjust the layout of your form, you can ignore the informational bar and continue working in the code editor or in other types of designers. Only the **Windows Forms Designer** is affected. If you do need to work in the **Windows Forms Designer**, the next section helps you [resolve the problem](#to-resolve-the-problem). +If you aren't working in the designer and don't need to adjust the layout of your form, you can ignore the informational bar and continue working in the code editor or in other types of designers. (You can also [disable notifications](#disable-notifications) so that the informational bar doesn't continue to appear.) Only the **Windows Forms Designer** is affected. If you do need to work in the **Windows Forms Designer**, the next section helps you [resolve the problem](#to-resolve-the-problem). ## To resolve the problem @@ -63,6 +63,16 @@ To set your display scaling setting to 100% in Windows 10, type **display settin Setting your display scaling to 100% may be undesirable, because it can make the user interface too small to be usable. +## Disable notifications + +You can choose not to be notified of DPI scaling issues in Visual Studio. You might want to disable notifications if you aren't working in the designer, for example. + +To disable notifications, choose **Tools** > **Options** to open the **Options** dialog. Then, choose **Windows Forms Designer** > **General**, and set **DPI Scaling Notifications** to **False**. + +![DPI scaling notifications option in Visual Studio](media/disable-dpi-awareness-visual-studio/notifications-option.png) + +If you want to later reenable scaling notifications, set the property to **True**. + ## Troubleshoot If the DPI-awareness transition isn't working as expected in Visual Studio, check to see if you have the `dpiAwareness` value in the **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\devenv.exe** subkey in Registry Editor. Delete the value if it's present. diff --git a/docs/framework/winforms/media/disable-dpi-awareness-visual-studio/notifications-option.png b/docs/framework/winforms/media/disable-dpi-awareness-visual-studio/notifications-option.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa7bfc4aeb809d5ed68735d388f249cd2c12abc GIT binary patch literal 27642 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

Wa=2B(pVFs`O+@ zUl0no9vC~Xvjj>~mpG)flfSSB6NnQNXwnaseS@^Ss{!Y#XI6u{pQrO?igE-tPh=vd zN;ZaIIpq|}DxNX;_|&rC>)v44MmkSfc&H=Qna&SkAO&#f`>co2RrVzgqDHi10x(jkC|X*lTc8E@A6YXJ1gyhXDaZb70Aoib{W2|bed+Q0cOz9e;hdy9tqp0<#=L|Nq zV$eI?C?XXox<*psYT+AkERzOQo#mFUJX?Jg!VZs-=ku{XmH`^MHW7B;IqmlftEPk; z$*sRh?PbcLFIhl{Z zLJhABhXiMT#MX)H19@$Y{`G0$0oo^op#W8nqFi<_j}dB;h^)**nM?>OhZU2faobUh zXO@&;8e*$r%RwTx3Og6}5{a5Ne7I;qUfn=>UN@45I!xcHcYW!Kwbrqc`?ES>jAAJF za-#O@4pGS`R@ER7CLm)a>#1`qyJCgi)S8L*!6wTv3ik4j7S_8eK2r^#ruJV~|M9rp z)v2YWuo)Vlmk6Nn93b;lBMaOC|ETAJK#~Z6ZAs5HBMqqu1S&^>mPTMuKkr5(R3bLW zm52qPr~sHA2ro_Y^vkXk>X?e-`26RN1?oYhJpx1dMR)J{5EZyB*aOT}aWv^T6MXpe zJD^37DgfPeV(%^!7PTk_(#IfBZ2&At0mLRipb2!q=t;nk{~{RJP>SJJg!4NAc=Lys zAoJF(fHRQJu+Yy z@5YK5_B|6(F;pu^9@cqK-viip9689p?ZUpR!w$p)Sb0DMWA9qX$f7kn7fF`Bz9kXaPWA;WyDgI+0P?sPUix`V(qas))Xfe?~ zwX!I4w`Z~u&$t5a{A$oz+|C)FDK9*5BGReo*|DTT^$_>JeaJzla7Q<{p#Gu}il*lB zEkOm^jn9=q$}4D)mo~ty8E)k4H>#92Yy0|ctZ735T1IP*vMt-=O1pO|E93x2msHhF z=!7t9N0jFzBgzdjt$Z?aVX^z2Ze{#_MgiYba`{1_q0(KCRqtl%zh>wE$rOvNH4VVl z(tj)rA^Enl3}Dgm8(t-4{j+}luivdh`-vX$1h^@ISptRLts@Yq2)GepzkA!PDpUpU zZ=Onq3caUrfBx9{=YW>|;<0}=hPJRs%%R^6AgCM&Ou||yM^%K)KWK6Ly05wZ!|`ys zm&;Yf+4XAH!4>7z6glvcDiXIrB#)Ch-ovZ|58kQ4IgYDaxH*1|2j?ljH(`g03(E+V I3h4O!FNhH=djJ3c literal 0 HcmV?d00001 From faa4ac78ce998a4e9b9e32cd01c61abf512d3926 Mon Sep 17 00:00:00 2001 From: Andy De George <2672110+Thraka@users.noreply.github.com> Date: Wed, 19 Dec 2018 12:22:17 -0800 Subject: [PATCH 09/14] .NET Core 3 Preview 1 reqs (#9611) * Updated prereqs for 3.0 * Change to table format; update os * change tab id and order * Fix formatting in macos * Playing with table layout; restoring table --- docs/core/linux-prerequisites.md | 30 +++++++++++++++++++++++++++++- docs/core/macos-prerequisites.md | 18 +++++++++++++++--- docs/core/windows-prerequisites.md | 12 +++++++++--- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/docs/core/linux-prerequisites.md b/docs/core/linux-prerequisites.md index 042c6a3617eaf..952573c36f189 100644 --- a/docs/core/linux-prerequisites.md +++ b/docs/core/linux-prerequisites.md @@ -3,7 +3,7 @@ title: Prerequisites for .NET Core on Linux description: Supported Linux versions and .NET Core dependencies to develop, deploy, and run .NET Core applications on Linux machines. author: thraka ms.author: adegeo -ms.date: 12/03/2018 +ms.date: 12/14/2018 --- # Prerequisites for .NET Core on Linux @@ -55,6 +55,34 @@ For download links and more information, see [.NET Core 1.1 downloads](https://w See [.NET Core 1.x Supported OS Versions](https://github.com/dotnet/core/blob/master/release-notes/1.0/1.0-supported-os.md) for the complete list of .NET Core 1.x supported operating systems, out of support OS versions, and lifecycle policy links. +# [.NET Core 3.0 Preview 1](#tab/netcore30) + +.NET Core 3.0 Preview 1 treats Linux as a single operating system. There is a single Linux build (per chip architecture) for supported Linux distributions. + +For download links and more information, see [.NET Core 3.0 downloads](https://dotnet.microsoft.com/download/dotnet-core/3.0). + +.NET Core 3.0 Preview 1 is supported on the following Linux distributions/versions. + +OS | Version | Architectures +------------------------------|-----------------------|---------------- +Red Hat Enterprise Linux | 6 | x64 +Red Hat Enterprise Linux
CentOS
Oracle Linux | 7 | x64 +Fedora | 28 | x64 +Debian | 9 | x64, ARM32\*, ARM64\* +Ubuntu | 16.04+, 18.04+ | x64, ARM32\*, ARM64\* +Linux Mint | 18 | x64 +openSUSE | 42.3+ | x64 +SUSE Enterprise Linux (SLES) | 12 SP2+ | x64 +Alpine Linux | 3.8+ | x64, ARM64 + +\* ARM32 and ARM64 support starts with Debian 9 and Ubuntu 16.04. Earlier versions of those distros are not supported on ARM chips. + +See [.NET Core 3.0 Supported OS Versions](https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md) for the complete list of .NET Core 3.0 supported operating systems, distributions and versions, out of support OS versions, and lifecycle policy links. + +For more information about how to install .NET Core 3.0 on ARM64, see [Installing .NET Core 3.0 on Linux ARM64](https://gist.github.com/richlander/467813274cea8abc624553ee72b28213). + + + --- ## Linux distribution dependencies diff --git a/docs/core/macos-prerequisites.md b/docs/core/macos-prerequisites.md index 8707b3ee20a0b..9311d62ee8c41 100644 --- a/docs/core/macos-prerequisites.md +++ b/docs/core/macos-prerequisites.md @@ -3,7 +3,7 @@ title: Prerequisites for .NET Core on Mac description: Supported macOS versions and .NET Core dependencies to develop, deploy, and run .NET Core applications on macOS machines. author: guardrex ms.author: adegeo -ms.date: 12/03/2018 +ms.date: 12/14/2018 --- # Prerequisites for .NET Core on macOS @@ -33,6 +33,16 @@ See [.NET Core 1.1 Supported OS Versions](https://github.com/dotnet/core/blob/ma For download links and more information, see [.NET Core 1.1 downloads](https://www.microsoft.com/net/download/dotnet-core/1.1) or [.NET Core 1.0 downloads](https://www.microsoft.com/net/download/dotnet-core/1.0). +# [.NET Core 3.0 Preview 1](#tab/netcore30) + +.NET Core 3.0 Preview 1 is supported on the following versions of macOS: + +* macOS 10.12 "Sierra" and later versions + +See [.NET Core 3.0 Supported OS Versions](https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md) for the complete list of .NET Core 3.0 supported operating systems, distributions and versions, out of support OS versions, and lifecycle policy links. + +For download links and more information, see [.NET Core 3.0 downloads](https://www.microsoft.com/net/download/dotnet-core/3.0). + --- ## .NET Core dependencies @@ -43,8 +53,6 @@ Download and install the .NET Core SDK from [.NET Downloads](https://www.microso # [.NET Core 1.x](#tab/netcore1x) -**.NET Core 1.x** - .NET Core 1.x requires OpenSSL when running on macOS. An easy way to obtain OpenSSL is by using the [Homebrew ("brew")](https://brew.sh/) package manager for macOS. After installing *brew*, install OpenSSL by executing the following commands at a Terminal (command) prompt: ```console @@ -57,6 +65,10 @@ ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/ Download and install the .NET Core SDK from [.NET Downloads](https://www.microsoft.com/net/download/core). If you have problems with the installation on macOS, consult the [1.0.0 Known Issues](https://github.com/dotnet/core/blob/master/release-notes/1.0/1.0.0-known-issues.md) and [1.0.1 Known Issues](https://github.com/dotnet/core/blob/master/release-notes/1.0/1.0.1-known-issues.md) topics. +# [.NET Core 3.0 Preview 1](#tab/netcore30) + +Download and install the .NET Core SDK from [.NET Downloads](https://www.microsoft.com/net/download/core). If you have problems with the installation on macOS, consult the [Release notes](https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md) topic for the version you have installed. + --- ## Increase the maximum open file limit (.NET Core versions before .NET Core SDK 2.0.2) diff --git a/docs/core/windows-prerequisites.md b/docs/core/windows-prerequisites.md index 4bd9787e411ad..28215da9d6067 100644 --- a/docs/core/windows-prerequisites.md +++ b/docs/core/windows-prerequisites.md @@ -1,8 +1,9 @@ --- title: Prerequisites for .NET Core on Windows description: Learn what dependencies you need on your Windows machine to develop and run .NET Core applications. -ms.date: 12/10/2018 +ms.date: 12/14/2018 --- + # Prerequisites for .NET Core on Windows This article shows the supported OS versions in order to run .NET Core applications on Windows. The supported OS versions and dependencies that follow apply to the three ways of developing .NET Core apps on Windows: @@ -29,11 +30,12 @@ Also, if you're developing on Windows using Visual Studio 2017, the [Prerequisit The following articles have a complete list of .NET Core supported operating systems per version: +* [.NET Core 3.0 (Preview)](https://github.com/dotnet/core/blob/master/release-notes/3.0/3.0-supported-os.md) * [.NET Core 2.2](https://github.com/dotnet/core/blob/master/release-notes/2.2/2.2-supported-os.md) * [.NET Core 2.1](https://github.com/dotnet/core/blob/master/release-notes/2.1/2.1-supported-os.md) * [.NET Core 1.0](https://github.com/dotnet/core/blob/master/release-notes/1.0/1.0-supported-os.md) -For download links and more information, see [.NET downloads](https://www.microsoft.com/net/download) to download the latest version or [.NET downloads archive](https://dotnet.microsoft.com/download/archives#dotnet-core) for older versions. +For download links and more information, see [.NET downloads](https://dotnet.microsoft.com/download) to download the latest version or [.NET downloads archive](https://dotnet.microsoft.com/download/archives#dotnet-core) for older versions. ## .NET Core dependencies @@ -55,8 +57,12 @@ For download links and more information, see [.NET downloads](https://www.micros > > In addition to KB2999226, make sure you also have [KB2533623](https://support.microsoft.com/en-us/help/2533623/microsoft-security-advisory-insecure-library-loading-could-allow-remot) installed. If you don't have this update installed, you'll see an error similar to the following when you launch a .NET Core application: `The library hostfxr.dll was found, but loading it from C:\\hostfxr.dll failed`. -## Prerequisites with Visual Studio 2017 +## Prerequisites for .NET Core 3.0 Preview 1 +.NET Core 3.0 Preview 1 has the same prerequisites as other versions of .NET Core. However, if you want to use Visual Studio to create .NET Core 3.0 projects, you must use the [Visual Studio 2019 Preview](https://visualstudio.microsoft.com/vs/preview/). Visual Studio 2019 Preview can be installed side-by-side with other versions of Visual Studio without conflict. + +## Prerequisites with Visual Studio 2017 + You can use any editor to develop .NET Core applications using the .NET Core SDK. Visual Studio 2017 provides an integrated development environment for .NET Core apps on Windows. You can read more about the changes in Visual Studio 2017 in the [release notes](/visualstudio/releasenotes/vs2017-relnotes). From 7386c1e8b5093576df4c011a26234d87c5946a53 Mon Sep 17 00:00:00 2001 From: John Alexander Date: Wed, 19 Dec 2018 14:38:49 -0600 Subject: [PATCH 10/14] Updated metadata to remove ms.author (#9684) Updated metadata to remove author as that's now in a file. --- docs/core/deploying/runtime-patch-selection.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/core/deploying/runtime-patch-selection.md b/docs/core/deploying/runtime-patch-selection.md index 23a9304e8db3d..643b0261b8cc1 100644 --- a/docs/core/deploying/runtime-patch-selection.md +++ b/docs/core/deploying/runtime-patch-selection.md @@ -1,8 +1,7 @@ --- title: Runtime roll forward for .NET Core self-contained app deployments. description: Learn about dotnet publish changes for self-contained deployments. -author: jralexander -ms.author: kdollard +author: KathleenDollard ms.date: 05/31/2018 ms.custom: seodec18 --- From ea80a5bdcfc37d09204643aa50a7bae52410261f Mon Sep 17 00:00:00 2001 From: John Alexander Date: Wed, 19 Dec 2018 14:39:37 -0600 Subject: [PATCH 11/14] Updated metadata to remove author (#9683) Updated metadata to remove author as that's now in a file. --- docs/core/docker/building-net-docker-images.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/core/docker/building-net-docker-images.md b/docs/core/docker/building-net-docker-images.md index 41b3375625f14..c4ae64c9a94f1 100644 --- a/docs/core/docker/building-net-docker-images.md +++ b/docs/core/docker/building-net-docker-images.md @@ -1,8 +1,6 @@ --- title: Docker images overview description: Learn how to use the published .NET Core Docker images from the Docker Registry. You will also learn how to pull images and build your own images. -author: jralexander -ms.author: johalex ms.date: 11/06/2017 ms.topic: tutorial ms.custom: "mvc, seodec18" From d5b93023629f198fc2ae49d3b026513aa2501b05 Mon Sep 17 00:00:00 2001 From: John Alexander Date: Wed, 19 Dec 2018 14:39:49 -0600 Subject: [PATCH 12/14] Updated metadata to remove author (#9682) Updated metadata to remove author as that's now in a file. --- docs/core/docker/intro-net-docker.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/core/docker/intro-net-docker.md b/docs/core/docker/intro-net-docker.md index eb7eee2a077be..8f4aba6b4f872 100644 --- a/docs/core/docker/intro-net-docker.md +++ b/docs/core/docker/intro-net-docker.md @@ -1,8 +1,6 @@ --- title: Introduction to Docker description: This article provides an introduction and overview to Docker in the context of a .NET Core application. -author: jralexander -ms.author: johalex ms.date: 11/06/2017 ms.custom: "mvc, seodec18" --- From 3f5e4d0f531479cdde638712dd3ff8fc3bce4090 Mon Sep 17 00:00:00 2001 From: Petr Kulikov Date: Wed, 19 Dec 2018 21:45:42 +0100 Subject: [PATCH 13/14] ML.NET: update the clustering tutorial (#9620) --- .../tutorials/iris-clustering.md | 86 ++++++++----------- docs/toc.md | 2 +- 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/docs/machine-learning/tutorials/iris-clustering.md b/docs/machine-learning/tutorials/iris-clustering.md index 7c0120ac3af0a..d10e7ad5378a2 100644 --- a/docs/machine-learning/tutorials/iris-clustering.md +++ b/docs/machine-learning/tutorials/iris-clustering.md @@ -3,7 +3,7 @@ title: Cluster iris flowers using a clustering learner - ML.NET description: Learn how to use ML.NET in a clustering scenario author: pkulikov ms.author: johalex -ms.date: 07/02/2018 +ms.date: 12/17/2018 ms.topic: tutorial ms.custom: mvc, seodec18 #Customer intent: As a developer, I want to use ML.NET so that I can build a model to cluster iris flowers based on its parameters. @@ -39,7 +39,7 @@ As you don't know to which group each flower belongs to, you choose the [unsuper ## Create a console application -1. Open Visual Studio 2017. Select **File** > **New** > **Project** from the menu bar. In the **New Project** dialog, select the **Visual C#** node followed by the **.NET Core** node. Then select the **Console App (.NET Core)** project template. In the **Name** text box, type "IrisClustering" and then select the **OK** button. +1. Open Visual Studio 2017. Select **File** > **New** > **Project** from the menu bar. In the **New Project** dialog, select the **Visual C#** node followed by the **.NET Core** node. Then select the **Console App (.NET Core)** project template. In the **Name** text box, type "IrisFlowerClustering" and then select the **OK** button. 1. Create a directory named *Data* in your project to store the data set and model files: @@ -73,11 +73,11 @@ Create classes for the input data and the predictions: 1. In the **Add New Item** dialog box, select **Class** and change the **Name** field to *IrisData.cs*. Then, select the **Add** button. 1. Add the following `using` directive to the new file: - [!code-csharp[Add necessary usings](../../../samples/machine-learning/tutorials/IrisClustering/IrisData.cs#1)] + [!code-csharp[Add necessary usings](~/samples/machine-learning/tutorials/IrisFlowerClustering/IrisData.cs#Usings)] Remove the existing class definition and add the following code, which defines the classes `IrisData` and `ClusterPrediction`, to the *IrisData.cs* file: -[!code-csharp[Define data classes](../../../samples/machine-learning/tutorials/IrisClustering/IrisData.cs#2)] +[!code-csharp[Define data classes](~/samples/machine-learning/tutorials/IrisFlowerClustering/IrisData.cs#ClassDefinitions)] `IrisData` is the input data class and has definitions for each feature from the data set. Use the [Column](xref:Microsoft.ML.Runtime.Api.ColumnAttribute) attribute to specify the indices of the source columns in the data set file. @@ -98,78 +98,66 @@ Go back to the *Program.cs* file and add two fields to hold the paths to the dat Add the following code right above the `Main` method to specify those paths: -[!code-csharp[Initialize paths](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#1)] +[!code-csharp[Initialize paths](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#Paths)] To make the preceding code compile, add the following `using` directives at the top of the *Program.cs* file: -[!code-csharp[Add usings for paths](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#2)] +[!code-csharp[Add usings for paths](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#UsingsForPaths)] -## Create a learning pipeline +## Create ML context Add the following additional `using` directives to the top of the *Program.cs* file: -[!code-csharp[Add Microsoft.ML usings](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#3)] - -In the `Main` method, replace the `Console.WriteLine("Hello World!")` with the following code: +[!code-csharp[Add Microsoft.ML usings](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#MLUsings)] -[!code-csharp[Call the Train method](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#4)] +In the `Main` method, replace the `Console.WriteLine("Hello World!");` line with the following code: -The `Train` method trains the model. Create that method just below the `Main` method, using the following code: +[!code-csharp[Create ML context](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#CreateContext)] -```csharp -private static PredictionModel Train() -{ +The class represents the machine learning environment and provides mechanisms for logging and entry points for data loading, model training, prediction, and other tasks. This is comparable conceptually to using `DbContext` in Entity Framework. -} -``` +## Setup data loading -The learning pipeline loads all of the data and algorithms necessary to train the model. Add the following code into the `Train` method: +Add the following code to the `Main` method to setup the way to load data: -[!code-csharp[Initialize pipeline](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#5)] +[!code-csharp[Create text loader](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#SetupTextLoader)] -## Load and transform data +Note that the column names and indices match the schema defined by the `IrisData` class. The value specifies the `float` type. -The first step to perform is to load the training data set. In our case, the training data set is stored in the text file with a path defined by the `_dataPath` field. Columns in the file are separated by the comma (","). Add the following code into the `Train` method: +Use instantiated instance to create an instance, which represents the data source for the training data set: -[!code-csharp[Add step to load data](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#6)] +[!code-csharp[Create IDataView](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#CreateDataView)] -The next step is to combine all of the feature columns into the **Features** column using the transformation class. By default, a learning algorithm processes only features from the **Features** column. Add the following code: - -[!code-csharp[Add step to concatenate columns](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#7)] +## Create a learning pipeline -## Choose a learning algorithm +For this tutorial, the learning pipeline of the clustering task comprises two following steps: -After adding the data to the pipeline and transforming it into the correct input format, you select a learning algorithm (**learner**). The learner trains the model. ML.NET provides a learner that implements [k-means algorithm](https://en.wikipedia.org/wiki/K-means_clustering) with an improved method for choosing the initial cluster centroids. +- concatenate loaded columns into one **Features** column, which is used by a clustering trainer; +- use a trainer to train the model using the k-means++ clustering algorithm. -Add the following code into the `Train` method following the data processing code added in the previous step: +Add the following code to the `Main` method: -[!code-csharp[Add a learner step](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#8)] +[!code-csharp[Create pipeline](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#CreatePipeline)] -Use the property to specify number of clusters. The code above specifies that the data set should be split in three clusters. +The code specifies that the data set should be split in three clusters. ## Train the model -The steps added in the preceding sections prepared the pipeline for training, however, none have been executed. The `pipeline.Train` method produces the model that takes in an instance of the `TInput` type and outputs an instance of the `TOutput` type. Add the following code into the `Train` method: +The steps added in the preceding sections prepared the pipeline for training, however, none have been executed. Add the following line to the `Main` method to perform data loading and model training: -[!code-csharp[Train the model and return](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#9)] +[!code-csharp[Train the model](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#TrainModel)] ### Save the model -At this point, you have a model that can be integrated into any of your existing or new .NET applications. To save your model to a .zip file, add the following code to the `Main` method below the call to the `Train` method: +At this point, you have a model that can be integrated into any of your existing or new .NET applications. To save your model to a .zip file, add the following code to the `Main` method: -[!code-csharp[Save the model](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#10)] +[!code-csharp[Save the model](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#SaveModel)] -Using `await` in the `Main` method means the `Main` method must have the `async` modifier and return a `Task`: - -[!code-csharp[Make the Main method async](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#11)] - -You also need to add the following `using` directive at the top of the *Program.cs* file: - -[!code-csharp[Add System.Threading.Tasks using](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#12)] +## Use the model for predictions -Because the `async Main` method is the feature added in C# 7.1 and the default language version of the project is C# 7.0, you need to change the language version to C# 7.1 or higher. To do that, right-click the project node in **Solution Explorer** and select **Properties**. Select the **Build** tab and select the **Advanced** button. In the dropdown, select **C# 7.1** (or a higher version). Select the **OK** button. +To make predictions, use the class that takes instances of the input type through the transformer pipeline and produces instances of the output type. Add the following line to the `Main` method to create an instance of that class: -## Use the model for predictions +[!code-csharp[Create predictor](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#Predictor)] Create the `TestIrisData` class to house test data instances: @@ -177,24 +165,24 @@ Create the `TestIrisData` class to house test data instances: 1. In the **Add New Item** dialog box, select **Class** and change the **Name** field to *TestIrisData.cs*. Then, select the **Add** button. 1. Modify the class to be static like in the following example: - [!code-csharp[Make class static](../../../samples/machine-learning/tutorials/IrisClustering/TestIrisData.cs#1)] + [!code-csharp[Make class static](~/samples/machine-learning/tutorials/IrisFlowerClustering/TestIrisData.cs#Static)] This tutorial introduces one iris data instance within this class. You can add other scenarios to experiment with the model. Add the following code into the `TestIrisData` class: -[!code-csharp[Test data](../../../samples/machine-learning/tutorials/IrisClustering/TestIrisData.cs#2)] +[!code-csharp[Test data](~/samples/machine-learning/tutorials/IrisFlowerClustering/TestIrisData.cs#TestData)] To find out the cluster to which the specified item belongs to, go back to the *Program.cs* file and add the following code into the `Main` method: -[!code-csharp[Predict and output results](../../../samples/machine-learning/tutorials/IrisClustering/Program.cs#13)] +[!code-csharp[Predict and output results](~/samples/machine-learning/tutorials/IrisFlowerClustering/Program.cs#PredictionExample)] -Run the program to see which cluster contains the specified data instance and squared distances from that instance to the cluster centroids. Your results should be similar to the following. As the pipeline processes, it might display warnings or processing messages. These have been removed from the following output for clarity. +Run the program to see which cluster contains the specified data instance and squared distances from that instance to the cluster centroids. Your results should be similar to the following: ```text Cluster: 2 -Distances: 0.4192338 0.0008847713 0.9660053 +Distances: 11.69127 0.02159119 25.59896 ``` -Congratulations! You've now successfully built a machine learning model for iris clustering and used it to make predictions. You can find the source code for this tutorial at the [dotnet/samples](https://github.com/dotnet/samples/tree/master/machine-learning/tutorials/IrisClustering) GitHub repository. +Congratulations! You've now successfully built a machine learning model for iris clustering and used it to make predictions. You can find the source code for this tutorial at the [dotnet/samples](https://github.com/dotnet/samples/tree/master/machine-learning/tutorials/IrisFlowerClustering) GitHub repository. ## Next steps diff --git a/docs/toc.md b/docs/toc.md index f81932ec1dccb..11773068b0e60 100644 --- a/docs/toc.md +++ b/docs/toc.md @@ -1177,7 +1177,7 @@ ## [Tutorials](machine-learning/tutorials/index.md) ### [Sentiment analysis (binary classification)](machine-learning/tutorials/sentiment-analysis.md) ### [Taxi fare predictor (regression)](machine-learning/tutorials/taxi-fare.md) -### [Iris petals (clustering)](machine-learning/tutorials/iris-clustering.md) +### [Iris flowers (clustering)](machine-learning/tutorials/iris-clustering.md) ## [How-to guides](machine-learning/how-to-guides/index.md) ### [Apply categorical feature engineering ](machine-learning/how-to-guides/train-model-categorical-ml-net.md) ### [Apply textual feature engineering ](machine-learning/how-to-guides/train-model-textual-ml-net.md) From 16a2245b165865ecf2c2aee6bb7f404ba1250204 Mon Sep 17 00:00:00 2001 From: qqqbbb Date: Thu, 20 Dec 2018 12:40:59 +0300 Subject: [PATCH 14/14] fix grammar (#9697) Replaced "A class or struct can implement one more interfaces." with "A class or struct can implement one or more interfaces." --- docs/csharp/tutorials/inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/csharp/tutorials/inheritance.md b/docs/csharp/tutorials/inheritance.md index 259cea20e1254..78c7564855554 100644 --- a/docs/csharp/tutorials/inheritance.md +++ b/docs/csharp/tutorials/inheritance.md @@ -146,7 +146,7 @@ The following table lists the categories of types that you can create in C# and Ordinarily, inheritance is used to express an "is a" relationship between a base class and one or more derived classes, where the derived classes are specialized versions of the base class; the derived class is a type of the base class. For example, the `Publication` class represents a publication of any kind, and the `Book` and `Magazine` classes represent specific types of publications. > [!NOTE] -> A class or struct can implement one more interfaces. While interface implementation is often presented as a workaround for single inheritance or as a way of using inheritance with structs, it is intended to express a different relationship (a "can do" relationship) between an interface and its implementing type than inheritance. An interface defines a subset of functionality (such as the ability to test for equality, to compare or sort objects, or to support culture-sensitive parsing and formatting) that the interface makes available to its implementing types. +> A class or struct can implement one or more interfaces. While interface implementation is often presented as a workaround for single inheritance or as a way of using inheritance with structs, it is intended to express a different relationship (a "can do" relationship) between an interface and its implementing type than inheritance. An interface defines a subset of functionality (such as the ability to test for equality, to compare or sort objects, or to support culture-sensitive parsing and formatting) that the interface makes available to its implementing types. Note that "is a" also expresses the relationship between a type and a specific instantiation of that type. In the following example, `Automobile` is a class that has three unique read-only properties: `Make`, the manufacturer of the automobile; `Model`, the kind of automobile; and `Year`, its year of manufacture. Your `Automobile` class also has a constructor whose arguments are assigned to the property values, and it overrides the method to produce a string that uniquely identifies the `Automobile` instance rather than the `Automobile` class.