summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--csharp.html.markdown123
-rw-r--r--elixir.html.markdown5
-rw-r--r--objective-c.html.markdown23
-rw-r--r--ru-ru/json-ru.html.markdown61
4 files changed, 177 insertions, 35 deletions
diff --git a/csharp.html.markdown b/csharp.html.markdown
index 47dd9683..479b7f01 100644
--- a/csharp.html.markdown
+++ b/csharp.html.markdown
@@ -5,6 +5,7 @@ contributors:
- ["Max Yankov", "https://github.com/golergka"]
- ["Melvyn Laïly", "http://x2a.yt"]
- ["Shaun McCarthy", "http://www.shaunmccarthy.com"]
+ - ["Wouter Van Schandevijl", "http://github.com/laoujin"]
filename: LearnCSharp.cs
---
@@ -18,22 +19,29 @@ C# is an elegant and type-safe object-oriented language that enables developers
Multi-line comments look like this
*/
/// <summary>
-/// This is an XML documentation comment
+/// This is an XML documentation comment which can be used to generate external
+/// documentation or provide context help within an IDE
/// </summary>
+//public void MethodOrClassOrOtherWithParsableHelp() {}
-// Specify namespaces application will be using
+// Specify the namespaces this source code will be using
+// The namespaces below are all part of the standard .NET Framework Class Libary
using System;
using System.Collections.Generic;
-using System.Data.Entity;
using System.Dynamic;
using System.Linq;
-using System.Linq.Expressions;
using System.Net;
using System.Threading.Tasks;
using System.IO;
-// defines scope to organize code into "packages"
-namespace Learning
+// But this one is not:
+using System.Data.Entity;
+// In order to be able to use it, you need to add a dll reference
+// This can be done with the NuGet package manager: `Install-Package EntityFramework`
+
+// Namespaces define scope to organize code into "packages" or "modules"
+// Using this code from another source file: using Learning.CSharp;
+namespace Learning.CSharp
{
// Each .cs file should at least contain a class with the same name as the file
// you're allowed to do otherwise, but shouldn't for sanity.
@@ -125,7 +133,7 @@ on a new line! ""Wow!"", the masses cried";
// Use const or read-only to make a variable immutable
// const values are calculated at compile time
- const int HOURS_I_WORK_PER_WEEK = 9001;
+ const int HoursWorkPerWeek = 9001;
///////////////////////////////////////////////////
// Data Structures
@@ -242,8 +250,15 @@ on a new line! ""Wow!"", the masses cried";
int fooDoWhile = 0;
do
{
- //Iterated 100 times, fooDoWhile 0->99
+ // Start iteration 100 times, fooDoWhile 0->99
+ if (false)
+ continue; // skip the current iteration
+
fooDoWhile++;
+
+ if (fooDoWhile == 50)
+ break; // breaks from the loop completely
+
} while (fooDoWhile < 100);
//for loop structure => for(<start_statement>; <conditional>; <step>)
@@ -301,7 +316,7 @@ on a new line! ""Wow!"", the masses cried";
// Converting data
// Convert String To Integer
- // this will throw an Exception on failure
+ // this will throw a FormatException on failure
int.Parse("123");//returns an integer version of "123"
// try parse will default to type default on failure
@@ -315,6 +330,11 @@ on a new line! ""Wow!"", the masses cried";
Convert.ToString(123);
// or
tryInt.ToString();
+
+ // Casting
+ // Cast decimal 15 to a int
+ // and then implicitly cast to long
+ long x = (int) 15M;
}
///////////////////////////////////////
@@ -367,8 +387,12 @@ on a new line! ""Wow!"", the masses cried";
}
// Methods can have the same name, as long as the signature is unique
- public static void MethodSignatures(string maxCount)
+ // A method that differs only in return type is not unique
+ public static void MethodSignatures(
+ ref int maxCount, // Pass by reference
+ out int count)
{
+ count = 15; // out param must be assigned before control leaves the method
}
// GENERICS
@@ -400,6 +424,10 @@ on a new line! ""Wow!"", the masses cried";
MethodSignatures(3, 1, 3, "Some", "Extra", "Strings");
MethodSignatures(3, another: 3); // explicity set a parameter, skipping optional ones
+ // BY REF AND OUT PARAMETERS
+ int maxCount = 0, count; // ref params must have value
+ MethodSignatures(ref maxCount, out count);
+
// EXTENSION METHODS
int i = 3;
i.Print(); // Defined below
@@ -435,6 +463,31 @@ on a new line! ""Wow!"", the masses cried";
Func<int, int> square = (x) => x * x; // Last T item is the return value
Console.WriteLine(square(3)); // 9
+ // ERROR HANDLING - coping with an uncertain world
+ try
+ {
+ var funBike = PennyFarthing.CreateWithGears(6);
+
+ // will no longer execute because CreateWithGears throws an exception
+ string some = "";
+ if (true) some = null;
+ some.ToLower(); // throws a NullReferenceException
+ }
+ catch (NotSupportedException)
+ {
+ Console.WriteLine("Not so much fun now!");
+ }
+ catch (Exception ex) // catch all other exceptions
+ {
+ throw new ApplicationException("It hit the fan", ex);
+ // throw; // A rethrow that preserves the callstack
+ }
+ // catch { } // catch-all without capturing the Exception
+ finally
+ {
+ // executes after try or catch
+ }
+
// DISPOSABLE RESOURCES MANAGEMENT - let you handle unmanaged resources easily.
// Most of objects that access unmanaged resources (file handle, device contexts, etc.)
// implement the IDisposable interface. The using statement takes care of
@@ -595,10 +648,26 @@ on a new line! ""Wow!"", the masses cried";
public BikeBrand Brand; // After declaring an enum type, we can declare the field of this type
+ // Decorate an enum with the FlagsAttribute to indicate that multiple values can be switched on
+ [Flags] // Any class derived from Attribute can be used to decorate types, methods, parameters etc
+ public enum BikeAccessories
+ {
+ None = 0,
+ Bell = 1,
+ MudGuards = 2, // need to set the values manually!
+ Racks = 4,
+ Lights = 8,
+ FullPackage = Bell | MudGuards | Racks | Lights
+ }
+
+ // Usage: aBike.Accessories.HasFlag(Bicycle.BikeAccessories.Bell)
+ // Before .NET 4: (aBike.Accessories & Bicycle.BikeAccessories.Bell) == Bicycle.BikeAccessories.Bell
+ public BikeAccessories Accessories { get; set; }
+
// Static members belong to the type itself rather then specific object.
// You can access them without a reference to any object:
// Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated);
- static public int BicyclesCreated = 0;
+ public static int BicyclesCreated { get; set; }
// readonly values are set at run time
// they can only be assigned upon declaration or in a constructor
@@ -682,7 +751,7 @@ on a new line! ""Wow!"", the masses cried";
// All though this is not entirely useful in this example, you
// could do bicycle[0] which yields "chris" to get the first passenger or
// bicycle[1] = "lisa" to set the passenger. (of this apparent quattrocycle)
- private string[] passengers = { "chris", "phil", "darren", "regina" }
+ private string[] passengers = { "chris", "phil", "darren", "regina" };
public string this[int i]
{
@@ -737,10 +806,17 @@ on a new line! ""Wow!"", the masses cried";
}
set
{
- throw new ArgumentException("You can't change gears on a PennyFarthing");
+ throw new InvalidOperationException("You can't change gears on a PennyFarthing");
}
}
+ public static PennyFarthing CreateWithGears(int gears)
+ {
+ var penny = new PennyFarthing(1, 1);
+ penny.Gear = gears; // Oops, can't do this!
+ return penny;
+ }
+
public override string Info()
{
string result = "PennyFarthing bicycle ";
@@ -784,7 +860,7 @@ on a new line! ""Wow!"", the masses cried";
/// EntityFramework Code First is awesome (similar to Ruby's ActiveRecord, but bidirectional)
/// http://msdn.microsoft.com/en-us/data/jj193542.aspx
/// </summary>
- public class BikeRepository : DbSet
+ public class BikeRepository : DbContext
{
public BikeRepository()
: base()
@@ -798,13 +874,15 @@ on a new line! ""Wow!"", the masses cried";
## Topics Not Covered
- * Flags
* Attributes
- * Static properties
- * Exceptions, Abstraction
- * ASP.NET (Web Forms/MVC/WebMatrix)
- * Winforms
- * Windows Presentation Foundation (WPF)
+ * async/await, yield, pragma directives
+ * Web Development
+ * ASP.NET MVC & WebApi (new)
+ * ASP.NET Web Forms (old)
+ * WebMatrix (tool)
+ * Desktop Development
+ * Windows Presentation Foundation (WPF) (new)
+ * Winforms (old)
## Further Reading
@@ -817,7 +895,4 @@ on a new line! ""Wow!"", the masses cried";
* [ASP.NET Web Matrix Tutorials](http://www.asp.net/web-pages/tutorials)
* [ASP.NET Web Forms Tutorials](http://www.asp.net/web-forms/tutorials)
* [Windows Forms Programming in C#](http://www.amazon.com/Windows-Forms-Programming-Chris-Sells/dp/0321116208)
-
-
-
-[C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx)
+ * [C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx)
diff --git a/elixir.html.markdown b/elixir.html.markdown
index 0a20e3df..fb5f183a 100644
--- a/elixir.html.markdown
+++ b/elixir.html.markdown
@@ -91,6 +91,11 @@ string.
<<1,2,3>> <> <<4,5>> #=> <<1,2,3,4,5>>
"hello " <> "world" #=> "hello world"
+# Ranges are represented as `start..end` (both inclusive)
+1..10 #=> 1..10
+lower..upper = 1..10 # Can use pattern matching on ranges as well
+[lower, upper] #=> [1, 10]
+
## ---------------------------
## -- Operators
## ---------------------------
diff --git a/objective-c.html.markdown b/objective-c.html.markdown
index caad49a5..56640a87 100644
--- a/objective-c.html.markdown
+++ b/objective-c.html.markdown
@@ -55,7 +55,7 @@ int main (int argc, const char * argv[])
id myObject2 = nil; // Weak typing
// %@ is an object
// 'description' is a convention to display the value of the Objects
- NSLog(@"%@ and %@", myObject1, [myObject2 description]); // Print "(null) and (null)"
+ NSLog(@"%@ and %@", myObject1, [myObject2 description]); // prints => "(null) and (null)"
// String
NSString *worldString = @"World";
@@ -128,9 +128,10 @@ int main (int argc, const char * argv[])
// May contain different data types, but must be an Objective-C object
NSArray *anArray = @[@1, @2, @3, @4];
NSNumber *thirdNumber = anArray[2];
- NSLog(@"Third number = %@", thirdNumber); // Print "Third number = 3"
- // NSMutableArray is mutable version of NSArray allowing to change items in array
- // and extend or shrink array object. Convenient, but not as efficient as NSArray
+ NSLog(@"Third number = %@", thirdNumber); // prints => "Third number = 3"
+ // NSMutableArray is a mutable version of NSArray, allowing you to change
+ // the items in the array and to extend or shrink the array object.
+ // Convenient, but not as efficient as NSArray.
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:2];
[mutableArray addObject:@"Hello"];
[mutableArray addObject:@"World"];
@@ -140,7 +141,7 @@ int main (int argc, const char * argv[])
// Dictionary object
NSDictionary *aDictionary = @{ @"key1" : @"value1", @"key2" : @"value2" };
NSObject *valueObject = aDictionary[@"A Key"];
- NSLog(@"Object = %@", valueObject); // Print "Object = (null)"
+ NSLog(@"Object = %@", valueObject); // prints => "Object = (null)"
// NSMutableDictionary also available as a mutable dictionary object
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithCapacity:2];
[mutableDictionary setObject:@"value1" forKey:@"key1"];
@@ -210,7 +211,7 @@ int main (int argc, const char * argv[])
while (ii < 4)
{
NSLog(@"%d,", ii++); // ii++ increments ii in-place, after using its value
- } // => prints "0,"
+ } // prints => "0,"
// "1,"
// "2,"
// "3,"
@@ -220,7 +221,7 @@ int main (int argc, const char * argv[])
for (jj=0; jj < 4; jj++)
{
NSLog(@"%d,", jj);
- } // => prints "0,"
+ } // prints => "0,"
// "1,"
// "2,"
// "3,"
@@ -230,7 +231,7 @@ int main (int argc, const char * argv[])
for (NSNumber *value in values)
{
NSLog(@"%@,", value);
- } // => prints "0,"
+ } // prints => "0,"
// "1,"
// "2,"
// "3,"
@@ -238,7 +239,7 @@ int main (int argc, const char * argv[])
// Object for loop statement. Can be used with any Objective-C object type
for (id item in values) {
NSLog(@"%@,", item);
- } // => prints "0,"
+ } // prints => "0,"
// "1,"
// "2,"
// "3,"
@@ -255,7 +256,7 @@ int main (int argc, const char * argv[])
} @finally
{
NSLog(@"Finally. Time to clean up.");
- } // => prints "Exception: File Not Found on System"
+ } // prints => "Exception: File Not Found on System"
// "Finally. Time to clean up."
// NSError objects are useful for function arguments to populate on user mistakes.
@@ -627,7 +628,7 @@ int main (int argc, const char * argv[]) {
@end
// Instances of Car now have access to the protocol.
Car *carInstance = [[Car alloc] init];
-[[carInstance setEngineOn:NO];
+[carInstance setEngineOn:NO];
[carInstance turnOnEngine];
if ([carInstance engineOn]) {
NSLog(@"Car engine is on."); // prints => "Car engine is on."
diff --git a/ru-ru/json-ru.html.markdown b/ru-ru/json-ru.html.markdown
new file mode 100644
index 00000000..52af3696
--- /dev/null
+++ b/ru-ru/json-ru.html.markdown
@@ -0,0 +1,61 @@
+---
+language: json
+filename: learnjson-ru.json
+contributors:
+ - ["Anna Harren", "https://github.com/iirelu"]
+ - ["Marco Scannadinari", "https://github.com/marcoms"]
+translators:
+ - ["Dmitry Bessonov", "https://github.com/TheDmitry"]
+lang: ru-ru
+---
+
+JSON - это очень простой формат обмена данными, и это будет самый легкий
+курс из когда-либо представленных "Learn X in Y Minutes".
+
+В чистом виде у JSON нет фактических комментариев, но большинство парсеров примут
+комментарии в Си-стиле (//, /\* \*/). Для таких целей, конечно, все правильно
+будет на 100% с точки зрения JSON. К счастью, в нашем случае данные скажут сами за себя.
+
+```json
+{
+ "ключ": "значение",
+
+ "ключи": "должны всегда заключаться в двойные кавычки",
+ "числа": 0,
+ "строки": "Пρивет, миρ. Допускаются все unicode-символы вместе с \"экранированием\".",
+ "содержит логический тип?": true,
+ "ничего": null,
+
+ "большое число": 1.2e+100,
+
+ "объекты": {
+ "комментарий": "Большинство ваших структур будут представлять из себя объекты.",
+
+ "массив": [0, 1, 2, 3, "Массивы могут содержать в себе любой тип.", 5],
+
+ "другой объект": {
+ "комментарий": "Они могут быть вложенными, и это очень полезно."
+ }
+ },
+
+ "бессмыслие": [
+ {
+ "источники калия": ["бананы"]
+ },
+ [
+ [1, 0, 0, 0],
+ [0, 1, 0, 0],
+ [0, 0, 1, "нео"],
+ [0, 0, 0, 1]
+ ]
+ ],
+
+ "альтернативный стиль": {
+ "комментарий": "проверьте это!"
+ , "позиция запятой": "неважна, хоть и перед значением, все равно правильно"
+ , "еще один комментарий": "как хорошо"
+ },
+
+ "это было недолго": "И вы справились. Теперь вы знаете все о JSON."
+}
+```