From ca4ba71a2d39d05e7c46cea80bda0bd990a0d2fc Mon Sep 17 00:00:00 2001 From: Apress Date: Tue, 11 Oct 2016 04:36:29 +0100 Subject: [PATCH] First commit --- 10_delegates/anonymous_1.cs | 56 +++ 10_delegates/anonymous_2.cs | 57 +++ 10_delegates/anonymous_3.cs | 75 ++++ 10_delegates/basic_use_1.cs | 44 +++ 10_delegates/binder_1.cs | 39 ++ 10_delegates/binder_2.cs | 40 ++ 10_delegates/binder_3.cs | 41 ++ 10_delegates/binder_4.cs | 59 +++ 10_delegates/capture_1.cs | 25 ++ 10_delegates/capture_2.cs | 24 ++ 10_delegates/chained_1.cs | 46 +++ 10_delegates/chained_2.cs | 50 +++ 10_delegates/events_1.cs | 58 +++ 10_delegates/events_2.cs | 68 ++++ 10_delegates/open_instance_1.cs | 53 +++ 10_delegates/open_instance_2.cs | 55 +++ 10_delegates/strategy_1.cs | 37 ++ 11_generics/10_constraints_1.cs | 74 ++++ 11_generics/10_constraints_2.cs | 75 ++++ 11_generics/10_constraints_3.cs | 74 ++++ 11_generics/10_constraints_examples_1.cs | 27 ++ 11_generics/10_constraints_examples_2.cs | 19 + 11_generics/10_default_value_1.cs | 40 ++ 11_generics/10_default_value_2.cs | 40 ++ 11_generics/10_delegate_constraint.cs | 22 ++ 11_generics/10_dynamic_closed_1.cs | 28 ++ 11_generics/10_enumerable_1.cs | 30 ++ 11_generics/10_example_1.cs | 7 + 11_generics/10_generic_accessibility_1.cs | 13 + 11_generics/10_generic_delegate_1.cs | 34 ++ 11_generics/10_generic_problems_1.cs | 31 ++ 11_generics/10_generic_problems_2.cs | 42 ++ 11_generics/10_generic_problems_3.cs | 71 ++++ 11_generics/10_generic_problems_4.cs | 75 ++++ 11_generics/10_generic_problems_5.cs | 79 ++++ 11_generics/10_generic_problems_6.cs | 87 +++++ 11_generics/10_generic_sorted_list_1.cs | 18 + 11_generics/10_generic_vs_nongeneric.cs | 22 ++ 11_generics/10_needs_constraints.cs | 26 ++ .../10_no_delegate_for_type_argument.cs | 34 ++ 11_generics/10_nullable_1.cs | 40 ++ 11_generics/10_template_derivation.cpp | 24 ++ 11_generics/10_template_method_1.cs | 55 +++ 12_threading/async_1.cs | 39 ++ 12_threading/async_2.cs | 46 +++ 12_threading/async_3.cs | 41 ++ 12_threading/async_4.cs | 41 ++ 12_threading/async_5.cs | 54 +++ 12_threading/foreground_1.cs | 20 + 12_threading/interlocked_1.cs | 53 +++ 12_threading/interlocked_2.cs | 79 ++++ 12_threading/monitor_1.cs | 68 ++++ 12_threading/monitor_2.cs | 56 +++ 12_threading/monitor_3.cs | 31 ++ 12_threading/monitor_4.cs | 42 ++ 12_threading/monitor_5.cs | 84 ++++ 12_threading/named_event_1.cs | 42 ++ 12_threading/thread_1.cs | 28 ++ 12_threading/thread_2.cs | 55 +++ 12_threading/thread_abort_1.cs | 31 ++ 12_threading/timer_1.cs | 25 ++ 12_threading/tls2.cs | 48 +++ 12_threading/tls_1.cs | 37 ++ 13_canonical_forms/13_clone_1.cs | 17 + 13_canonical_forms/13_clone_2.cs | 27 ++ 13_canonical_forms/13_clone_3.cs | 63 +++ 13_canonical_forms/13_clone_4.cs | 19 + 13_canonical_forms/13_clone_attribute.cs | 27 ++ 13_canonical_forms/13_comparable_1.cs | 66 ++++ 13_canonical_forms/13_const_correct_1.cs | 72 ++++ 13_canonical_forms/13_convertible_1.cs | 24 ++ 13_canonical_forms/13_dispose_1.cs | 17 + 13_canonical_forms/13_dispose_2.cs | 11 + 13_canonical_forms/13_dispose_3.cs | 28 ++ 13_canonical_forms/13_finalize_1.cs | 46 +++ 13_canonical_forms/13_finalize_2.cs | 82 ++++ 13_canonical_forms/13_formattable_1.cs | 47 +++ 13_canonical_forms/13_gethashcode_1.cs | 38 ++ 13_canonical_forms/13_nvi_1.cs | 23 ++ 13_canonical_forms/13_nvi_2.cs | 27 ++ 13_canonical_forms/13_nvi_3.cs | 30 ++ 13_canonical_forms/13_operators_1.cs | 37 ++ 13_canonical_forms/13_string_oddity_1.cs | 22 ++ 13_canonical_forms/13_strong_types_1.cs | 68 ++++ 13_canonical_forms/13_strong_types_2.cs | 58 +++ 13_canonical_forms/13_typesafe_methods_1.cs | 88 +++++ 13_canonical_forms/13_value_equals_1.cs | 81 ++++ 13_canonical_forms/13_value_equals_2.cs | 85 ++++ 13_canonical_forms/4_equality_1.cs | 16 + 13_canonical_forms/4_equality_3.cs | 27 ++ 13_canonical_forms/4_ref_type_equals_1.cs | 57 +++ 13_canonical_forms/4_references_1.cs | 8 + 13_canonical_forms/4_references_2.cs | 23 ++ 14_extension_methods/custom_iterator_1.cs | 22 ++ 14_extension_methods/custom_iterator_2.cs | 32 ++ 14_extension_methods/custom_iterator_3.cs | 72 ++++ 14_extension_methods/custom_iterator_4.cs | 79 ++++ 14_extension_methods/custom_iterator_5.cs | 96 +++++ 14_extension_methods/custom_iterator_6.cs | 95 +++++ 14_extension_methods/custom_iterator_7.cs | 93 +++++ 14_extension_methods/ext_method_intro_1.cs | 26 ++ 14_extension_methods/ext_method_lookup_1.cs | 102 +++++ 14_extension_methods/transform_1.cs | 24 ++ 14_extension_methods/transform_2.cs | 38 ++ 14_extension_methods/transform_3.cs | 39 ++ 14_extension_methods/transform_4.cs | 39 ++ 14_extension_methods/transform_chain_1.cs | 47 +++ 14_extension_methods/visitor_1.cs | 51 +++ 14_extension_methods/visitor_2.cs | 61 +++ 14_extension_methods/visitor_3.cs | 70 ++++ 15_lambda_expressions/closure_1.cs | 16 + 15_lambda_expressions/compound_lambda_1.cs | 17 + 15_lambda_expressions/currying_1.cs | 37 ++ 15_lambda_expressions/currying_2.cs | 36 ++ 15_lambda_expressions/custom_iterators_1a.cs | 41 ++ 15_lambda_expressions/custom_iterators_2.cs | 26 ++ 15_lambda_expressions/expression_tree_1.cs | 17 + 15_lambda_expressions/expression_tree_2.cs | 20 + 15_lambda_expressions/expression_tree_3.cs | 24 ++ 15_lambda_expressions/lambda_expression_1.cs | 12 + 15_lambda_expressions/lambda_expression_2.cs | 12 + 15_lambda_expressions/lambda_expression_3.cs | 21 + 15_lambda_expressions/lambda_expression_3a.cs | 41 ++ 15_lambda_expressions/lambda_expression_3b.cs | 22 ++ 15_lambda_expressions/lambda_expression_4.cs | 30 ++ 15_lambda_expressions/memoization_1.cs | 14 + 15_lambda_expressions/memoization_2.cs | 33 ++ 15_lambda_expressions/memoization_3.cs | 53 +++ 16_linq/custom_sqo_1.cs | 36 ++ 16_linq/group_1.cs | 24 ++ 16_linq/group_2.cs | 52 +++ 16_linq/infinite_1.cs | 22 ++ 16_linq/infinite_2.cs | 25 ++ 16_linq/into_1.cs | 31 ++ 16_linq/into_2.cs | 30 ++ 16_linq/join_1.cs | 62 +++ 16_linq/let_1.cs | 39 ++ 16_linq/let_2.cs | 23 ++ 16_linq/linq_onto_console_1.cs | 24 ++ 16_linq/multiple_from_1.cs | 22 ++ 16_linq/non_generic_linq_1.cs | 19 + 16_linq/orderby_1.cs | 47 +++ 16_linq/projector_1.cs | 28 ++ 16_linq/projector_2.cs | 20 + 16_linq/simple_query_1.cs | 49 +++ 16_linq/simple_query_1a.cs | 48 +++ 16_linq/simple_query_2.cs | 50 +++ 16_linq/simple_query_3.cs | 54 +++ 16_linq/sort_non_enum_1.cs | 115 ++++++ 16_linq/sort_non_enum_2.cs | 167 ++++++++ 16_linq/test.cs | 81 ++++ 3828.pdf | Bin 0 -> 209263 bytes 3829.pdf | Bin 0 -> 175548 bytes 3_syntax_overview/3_generics_1.cs | 27 ++ 3_syntax_overview/as_1.cs | 39 ++ 3_syntax_overview/boxing.cs | 13 + 3_syntax_overview/conversions_1.cs | 9 + 3_syntax_overview/implicit_type_1.cs | 17 + 3_syntax_overview/is_1.cs | 29 ++ 3_syntax_overview/references_1.cs | 19 + 3_syntax_overview/references_2.cs | 19 + 3_syntax_overview/references_3.cs | 19 + 3_syntax_overview/values_1.cs | 30 ++ 4_classes_structs/4_abstract_classes_1.cs | 25 ++ 4_classes_structs/4_beforefieldinit_1.cs | 26 ++ 4_classes_structs/4_box_1.cs | 12 + 4_classes_structs/4_box_2.cs | 15 + 4_classes_structs/4_box_3.cs | 57 +++ 4_classes_structs/4_box_4.cs | 30 ++ 4_classes_structs/4_box_5.cs | 27 ++ 4_classes_structs/4_class_definition_1.cs | 13 + 4_classes_structs/4_compareto_1.cs | 90 +++++ 4_classes_structs/4_containment_example_1.cs | 12 + 4_classes_structs/4_containment_example_2.cs | 17 + 4_classes_structs/4_containment_example_3.cs | 24 ++ 4_classes_structs/4_ctor_struct_1.cs | 26 ++ 4_classes_structs/4_ctor_struct_2.cs | 43 ++ 4_classes_structs/4_ctor_struct_3.cs | 9 + 4_classes_structs/4_destructor_1.cs | 25 ++ 4_classes_structs/4_destructor_2.cs | 33 ++ 4_classes_structs/4_destructor_3.cs | 34 ++ 4_classes_structs/4_disposable.cs | 47 +++ 4_classes_structs/4_disposable_2.cs | 48 +++ .../4_encapsulation_example_1.cs | 5 + .../4_encapsulation_example_2.cs | 10 + .../4_encapsulation_example_3.cs | 12 + .../4_encapsulation_example_4.cs | 16 + .../4_encapsulation_example_5.cs | 47 +++ 4_classes_structs/4_equality_2.cs | 21 + 4_classes_structs/4_field_init_1.cs | 39 ++ 4_classes_structs/4_field_initializers_1.cs | 24 ++ 4_classes_structs/4_indexer_1.cs | 71 ++++ 4_classes_structs/4_inheritance_1.cs | 27 ++ 4_classes_structs/4_inheritance_2.cs | 8 + 4_classes_structs/4_inheritance_3.cs | 26 ++ 4_classes_structs/4_inheritance_4.cs | 34 ++ 4_classes_structs/4_inheritance_5.cs | 39 ++ 4_classes_structs/4_inst_ctor_1.cs | 59 +++ 4_classes_structs/4_inst_ctor_2.cs | 38 ++ 4_classes_structs/4_inst_init_1.cs | 20 + 4_classes_structs/4_instance_ctor_1.cs | 33 ++ 4_classes_structs/4_instance_method_1.cs | 27 ++ 4_classes_structs/4_interface_1.cs | 23 ++ 4_classes_structs/4_nested_classes_1.cs | 94 +++++ 4_classes_structs/4_nested_classes_2.cs | 14 + 4_classes_structs/4_nested_classes_3.cs | 13 + 4_classes_structs/4_new_2.cs | 24 ++ 4_classes_structs/4_out_param_1.cs | 11 + 4_classes_structs/4_override_1.cs | 25 ++ 4_classes_structs/4_override_2.cs | 27 ++ 4_classes_structs/4_param_array_1.cs | 19 + 4_classes_structs/4_partial_methods_1a.cs | 7 + 4_classes_structs/4_partial_methods_1b.cs | 21 + 4_classes_structs/4_properties_1.cs | 18 + 4_classes_structs/4_properties_2.cs | 31 ++ 4_classes_structs/4_properties_3.cs | 14 + 4_classes_structs/4_properties_4.cs | 17 + 4_classes_structs/4_readonly_1.cs | 30 ++ 4_classes_structs/4_ref_param_1.cs | 30 ++ 4_classes_structs/4_ref_param_2.cs | 19 + 4_classes_structs/4_specialization_1.cs | 40 ++ 4_classes_structs/4_static_class_1.cs | 38 ++ 4_classes_structs/4_static_ctor_1.cs | 44 +++ 4_classes_structs/4_static_field_example_1.cs | 33 ++ 4_classes_structs/4_static_method_1.cs | 13 + 4_classes_structs/4_struct_this_1.cs | 25 ++ 4_classes_structs/4_struct_this_2.cs | 16 + 4_classes_structs/4_struct_this_3.cs | 25 ++ 4_classes_structs/4_struct_this_4.cs | 17 + 4_classes_structs/4_types_vs_class.cs | 28 ++ 4_classes_structs/anonymous_types_1.cs | 18 + 4_classes_structs/anonymous_types_2.cs | 58 +++ 4_classes_structs/obj_initializer_1.cs | 22 ++ 4_classes_structs/obj_initializer_2.cs | 29 ++ 4_classes_structs/obj_initializer_3.cs | 39 ++ 5_interfaces/abstract_1.cs | 21 + 5_interfaces/abstract_2.cs | 26 ++ 5_interfaces/crazy_1.cs | 39 ++ 5_interfaces/diamond_1.cs | 19 + 5_interfaces/diamond_2.cs | 33 ++ 5_interfaces/diamond_3.cs | 41 ++ 5_interfaces/diamond_4.cs | 39 ++ 5_interfaces/diamond_5.cs | 46 +++ 5_interfaces/diamond_6.cs | 46 +++ 5_interfaces/iface_1.cs | 12 + 5_interfaces/iface_2.cs | 27 ++ 5_interfaces/method_search_1.cs | 46 +++ 5_interfaces/value_type_1.cs | 30 ++ 5_interfaces/value_type_2.cs | 34 ++ 5_interfaces/zoo_1.cs | 51 +++ 5_interfaces/zoo_2.cs | 67 ++++ 6_operators/6_complex_1.cs | 64 +++ 6_operators/6_complex_2.cs | 117 ++++++ 6_operators/6_complex_3.cs | 48 +++ 6_operators/6_complex_4.cs | 51 +++ 6_operators/6_complex_5.cs | 47 +++ 6_operators/6_invalid_use_1.cs | 17 + 7_exception_safety/7_employee_database_1.cs | 7 + 7_exception_safety/7_employee_database_2.cs | 17 + 7_exception_safety/7_employee_database_3.cs | 33 ++ 7_exception_safety/7_employee_database_4.cs | 42 ++ 7_exception_safety/7_employee_database_4a.cs | 49 +++ 7_exception_safety/7_employee_database_5.cs | 41 ++ 7_exception_safety/7_exception_syntax_1.cs | 41 ++ 7_exception_safety/7_exception_syntax_2.cs | 29 ++ 7_exception_safety/7_exception_syntax_2a.cs | 36 ++ 7_exception_safety/7_exception_syntax_3.cs | 26 ++ 7_exception_safety/7_exception_syntax_4.cs | 29 ++ 7_exception_safety/7_exception_syntax_5.cs | 26 ++ 7_exception_safety/7_rollback_1.cs | 82 ++++ 7_exception_safety/7_safe_handle_1.cs | 108 +++++ 7_exception_safety/7_using_1.cs | 34 ++ 7_exception_safety/7_using_2.cs | 52 +++ 7_exception_safety/7_using_3.cs | 38 ++ 8_strings/8_carib_1.cs | 24 ++ 8_strings/8_carib_2.cs | 10 + 8_strings/8_complex_1.cs | 54 +++ 8_strings/8_complex_2.cs | 96 +++++ 8_strings/8_encoding_1.cs | Bin 0 -> 3068 bytes 8_strings/8_formatting_1.cs | 23 ++ 8_strings/8_formatting_2.cs | 21 + 8_strings/8_regex_1.cs | 26 ++ 8_strings/8_regex_2.cs | 29 ++ 8_strings/8_regex_3.cs | 35 ++ 8_strings/8_regex_4.cs | 38 ++ 8_strings/8_regex_5.cs | 28 ++ 8_strings/8_regex_6.cs | 22 ++ 8_strings/8_regex_7.cs | 35 ++ 8_strings/8_regex_7a.cs | 26 ++ 8_strings/8_regex_8.cs | 48 +++ 8_strings/8_string_literals_1.cs | 28 ++ 8_strings/8_stringbuilder_1.cs | 21 + 8_strings/x-en-US-metric.ldml | 369 ++++++++++++++++++ 9781590598733.jpg | Bin 0 -> 9549 bytes 9_arrays_collections/9_array_1.cs | 15 + 9_arrays_collections/9_array_2.cs | 16 + .../9_bidirectional_iterator_1.cs | 86 ++++ 9_arrays_collections/9_circular_iterator_1.cs | 71 ++++ 9_arrays_collections/9_enumerable_1.cs | 19 + 9_arrays_collections/9_jagged_1.cs | 30 ++ 9_arrays_collections/9_multidim_1.cs | 16 + 9_arrays_collections/9_multidim_2.cs | 26 ++ 9_arrays_collections/9_my_collection_1.cs | 44 +++ 9_arrays_collections/9_mycoll_1.cs | 79 ++++ 9_arrays_collections/9_mycoll_2.cs | 34 ++ 9_arrays_collections/9_mycoll_3.cs | 36 ++ 9_arrays_collections/9_mycoll_4.cs | 54 +++ 9_arrays_collections/9_mycoll_5.cs | 75 ++++ 9_arrays_collections/9_reverse_iterator_1.cs | 24 ++ 9_arrays_collections/9_vector_1.cs | 16 + 9_arrays_collections/coll_initializer_1.cs | 23 ++ .../implicitly_typed_arrays_1.cs | 21 + .../implicitly_typed_arrays_2.cs | 38 ++ .../implicitly_typed_arrays_3.cs | 18 + LICENSE.txt | 27 ++ README.md | 15 + README_FIRST.html | 165 ++++++++ build.proj | 240 ++++++++++++ contributing.md | 14 + intro_to_c_sharp/hello_world.cs | 6 + intro_to_c_sharp/hello_world_2.cs | 8 + 321 files changed, 12626 insertions(+) create mode 100644 10_delegates/anonymous_1.cs create mode 100644 10_delegates/anonymous_2.cs create mode 100644 10_delegates/anonymous_3.cs create mode 100644 10_delegates/basic_use_1.cs create mode 100644 10_delegates/binder_1.cs create mode 100644 10_delegates/binder_2.cs create mode 100644 10_delegates/binder_3.cs create mode 100644 10_delegates/binder_4.cs create mode 100644 10_delegates/capture_1.cs create mode 100644 10_delegates/capture_2.cs create mode 100644 10_delegates/chained_1.cs create mode 100644 10_delegates/chained_2.cs create mode 100644 10_delegates/events_1.cs create mode 100644 10_delegates/events_2.cs create mode 100644 10_delegates/open_instance_1.cs create mode 100644 10_delegates/open_instance_2.cs create mode 100644 10_delegates/strategy_1.cs create mode 100644 11_generics/10_constraints_1.cs create mode 100644 11_generics/10_constraints_2.cs create mode 100644 11_generics/10_constraints_3.cs create mode 100644 11_generics/10_constraints_examples_1.cs create mode 100644 11_generics/10_constraints_examples_2.cs create mode 100644 11_generics/10_default_value_1.cs create mode 100644 11_generics/10_default_value_2.cs create mode 100644 11_generics/10_delegate_constraint.cs create mode 100644 11_generics/10_dynamic_closed_1.cs create mode 100644 11_generics/10_enumerable_1.cs create mode 100644 11_generics/10_example_1.cs create mode 100644 11_generics/10_generic_accessibility_1.cs create mode 100644 11_generics/10_generic_delegate_1.cs create mode 100644 11_generics/10_generic_problems_1.cs create mode 100644 11_generics/10_generic_problems_2.cs create mode 100644 11_generics/10_generic_problems_3.cs create mode 100644 11_generics/10_generic_problems_4.cs create mode 100644 11_generics/10_generic_problems_5.cs create mode 100644 11_generics/10_generic_problems_6.cs create mode 100644 11_generics/10_generic_sorted_list_1.cs create mode 100644 11_generics/10_generic_vs_nongeneric.cs create mode 100644 11_generics/10_needs_constraints.cs create mode 100644 11_generics/10_no_delegate_for_type_argument.cs create mode 100644 11_generics/10_nullable_1.cs create mode 100644 11_generics/10_template_derivation.cpp create mode 100644 11_generics/10_template_method_1.cs create mode 100644 12_threading/async_1.cs create mode 100644 12_threading/async_2.cs create mode 100644 12_threading/async_3.cs create mode 100644 12_threading/async_4.cs create mode 100644 12_threading/async_5.cs create mode 100644 12_threading/foreground_1.cs create mode 100644 12_threading/interlocked_1.cs create mode 100644 12_threading/interlocked_2.cs create mode 100644 12_threading/monitor_1.cs create mode 100644 12_threading/monitor_2.cs create mode 100644 12_threading/monitor_3.cs create mode 100644 12_threading/monitor_4.cs create mode 100644 12_threading/monitor_5.cs create mode 100644 12_threading/named_event_1.cs create mode 100644 12_threading/thread_1.cs create mode 100644 12_threading/thread_2.cs create mode 100644 12_threading/thread_abort_1.cs create mode 100644 12_threading/timer_1.cs create mode 100644 12_threading/tls2.cs create mode 100644 12_threading/tls_1.cs create mode 100644 13_canonical_forms/13_clone_1.cs create mode 100644 13_canonical_forms/13_clone_2.cs create mode 100644 13_canonical_forms/13_clone_3.cs create mode 100644 13_canonical_forms/13_clone_4.cs create mode 100644 13_canonical_forms/13_clone_attribute.cs create mode 100644 13_canonical_forms/13_comparable_1.cs create mode 100644 13_canonical_forms/13_const_correct_1.cs create mode 100644 13_canonical_forms/13_convertible_1.cs create mode 100644 13_canonical_forms/13_dispose_1.cs create mode 100644 13_canonical_forms/13_dispose_2.cs create mode 100644 13_canonical_forms/13_dispose_3.cs create mode 100644 13_canonical_forms/13_finalize_1.cs create mode 100644 13_canonical_forms/13_finalize_2.cs create mode 100644 13_canonical_forms/13_formattable_1.cs create mode 100644 13_canonical_forms/13_gethashcode_1.cs create mode 100644 13_canonical_forms/13_nvi_1.cs create mode 100644 13_canonical_forms/13_nvi_2.cs create mode 100644 13_canonical_forms/13_nvi_3.cs create mode 100644 13_canonical_forms/13_operators_1.cs create mode 100644 13_canonical_forms/13_string_oddity_1.cs create mode 100644 13_canonical_forms/13_strong_types_1.cs create mode 100644 13_canonical_forms/13_strong_types_2.cs create mode 100644 13_canonical_forms/13_typesafe_methods_1.cs create mode 100644 13_canonical_forms/13_value_equals_1.cs create mode 100644 13_canonical_forms/13_value_equals_2.cs create mode 100644 13_canonical_forms/4_equality_1.cs create mode 100644 13_canonical_forms/4_equality_3.cs create mode 100644 13_canonical_forms/4_ref_type_equals_1.cs create mode 100644 13_canonical_forms/4_references_1.cs create mode 100644 13_canonical_forms/4_references_2.cs create mode 100644 14_extension_methods/custom_iterator_1.cs create mode 100644 14_extension_methods/custom_iterator_2.cs create mode 100644 14_extension_methods/custom_iterator_3.cs create mode 100644 14_extension_methods/custom_iterator_4.cs create mode 100644 14_extension_methods/custom_iterator_5.cs create mode 100644 14_extension_methods/custom_iterator_6.cs create mode 100644 14_extension_methods/custom_iterator_7.cs create mode 100644 14_extension_methods/ext_method_intro_1.cs create mode 100644 14_extension_methods/ext_method_lookup_1.cs create mode 100644 14_extension_methods/transform_1.cs create mode 100644 14_extension_methods/transform_2.cs create mode 100644 14_extension_methods/transform_3.cs create mode 100644 14_extension_methods/transform_4.cs create mode 100644 14_extension_methods/transform_chain_1.cs create mode 100644 14_extension_methods/visitor_1.cs create mode 100644 14_extension_methods/visitor_2.cs create mode 100644 14_extension_methods/visitor_3.cs create mode 100644 15_lambda_expressions/closure_1.cs create mode 100644 15_lambda_expressions/compound_lambda_1.cs create mode 100644 15_lambda_expressions/currying_1.cs create mode 100644 15_lambda_expressions/currying_2.cs create mode 100644 15_lambda_expressions/custom_iterators_1a.cs create mode 100644 15_lambda_expressions/custom_iterators_2.cs create mode 100644 15_lambda_expressions/expression_tree_1.cs create mode 100644 15_lambda_expressions/expression_tree_2.cs create mode 100644 15_lambda_expressions/expression_tree_3.cs create mode 100644 15_lambda_expressions/lambda_expression_1.cs create mode 100644 15_lambda_expressions/lambda_expression_2.cs create mode 100644 15_lambda_expressions/lambda_expression_3.cs create mode 100644 15_lambda_expressions/lambda_expression_3a.cs create mode 100644 15_lambda_expressions/lambda_expression_3b.cs create mode 100644 15_lambda_expressions/lambda_expression_4.cs create mode 100644 15_lambda_expressions/memoization_1.cs create mode 100644 15_lambda_expressions/memoization_2.cs create mode 100644 15_lambda_expressions/memoization_3.cs create mode 100644 16_linq/custom_sqo_1.cs create mode 100644 16_linq/group_1.cs create mode 100644 16_linq/group_2.cs create mode 100644 16_linq/infinite_1.cs create mode 100644 16_linq/infinite_2.cs create mode 100644 16_linq/into_1.cs create mode 100644 16_linq/into_2.cs create mode 100644 16_linq/join_1.cs create mode 100644 16_linq/let_1.cs create mode 100644 16_linq/let_2.cs create mode 100644 16_linq/linq_onto_console_1.cs create mode 100644 16_linq/multiple_from_1.cs create mode 100644 16_linq/non_generic_linq_1.cs create mode 100644 16_linq/orderby_1.cs create mode 100644 16_linq/projector_1.cs create mode 100644 16_linq/projector_2.cs create mode 100644 16_linq/simple_query_1.cs create mode 100644 16_linq/simple_query_1a.cs create mode 100644 16_linq/simple_query_2.cs create mode 100644 16_linq/simple_query_3.cs create mode 100644 16_linq/sort_non_enum_1.cs create mode 100644 16_linq/sort_non_enum_2.cs create mode 100644 16_linq/test.cs create mode 100644 3828.pdf create mode 100644 3829.pdf create mode 100644 3_syntax_overview/3_generics_1.cs create mode 100644 3_syntax_overview/as_1.cs create mode 100644 3_syntax_overview/boxing.cs create mode 100644 3_syntax_overview/conversions_1.cs create mode 100644 3_syntax_overview/implicit_type_1.cs create mode 100644 3_syntax_overview/is_1.cs create mode 100644 3_syntax_overview/references_1.cs create mode 100644 3_syntax_overview/references_2.cs create mode 100644 3_syntax_overview/references_3.cs create mode 100644 3_syntax_overview/values_1.cs create mode 100644 4_classes_structs/4_abstract_classes_1.cs create mode 100644 4_classes_structs/4_beforefieldinit_1.cs create mode 100644 4_classes_structs/4_box_1.cs create mode 100644 4_classes_structs/4_box_2.cs create mode 100644 4_classes_structs/4_box_3.cs create mode 100644 4_classes_structs/4_box_4.cs create mode 100644 4_classes_structs/4_box_5.cs create mode 100644 4_classes_structs/4_class_definition_1.cs create mode 100644 4_classes_structs/4_compareto_1.cs create mode 100644 4_classes_structs/4_containment_example_1.cs create mode 100644 4_classes_structs/4_containment_example_2.cs create mode 100644 4_classes_structs/4_containment_example_3.cs create mode 100644 4_classes_structs/4_ctor_struct_1.cs create mode 100644 4_classes_structs/4_ctor_struct_2.cs create mode 100644 4_classes_structs/4_ctor_struct_3.cs create mode 100644 4_classes_structs/4_destructor_1.cs create mode 100644 4_classes_structs/4_destructor_2.cs create mode 100644 4_classes_structs/4_destructor_3.cs create mode 100644 4_classes_structs/4_disposable.cs create mode 100644 4_classes_structs/4_disposable_2.cs create mode 100644 4_classes_structs/4_encapsulation_example_1.cs create mode 100644 4_classes_structs/4_encapsulation_example_2.cs create mode 100644 4_classes_structs/4_encapsulation_example_3.cs create mode 100644 4_classes_structs/4_encapsulation_example_4.cs create mode 100644 4_classes_structs/4_encapsulation_example_5.cs create mode 100644 4_classes_structs/4_equality_2.cs create mode 100644 4_classes_structs/4_field_init_1.cs create mode 100644 4_classes_structs/4_field_initializers_1.cs create mode 100644 4_classes_structs/4_indexer_1.cs create mode 100644 4_classes_structs/4_inheritance_1.cs create mode 100644 4_classes_structs/4_inheritance_2.cs create mode 100644 4_classes_structs/4_inheritance_3.cs create mode 100644 4_classes_structs/4_inheritance_4.cs create mode 100644 4_classes_structs/4_inheritance_5.cs create mode 100644 4_classes_structs/4_inst_ctor_1.cs create mode 100644 4_classes_structs/4_inst_ctor_2.cs create mode 100644 4_classes_structs/4_inst_init_1.cs create mode 100644 4_classes_structs/4_instance_ctor_1.cs create mode 100644 4_classes_structs/4_instance_method_1.cs create mode 100644 4_classes_structs/4_interface_1.cs create mode 100644 4_classes_structs/4_nested_classes_1.cs create mode 100644 4_classes_structs/4_nested_classes_2.cs create mode 100644 4_classes_structs/4_nested_classes_3.cs create mode 100644 4_classes_structs/4_new_2.cs create mode 100644 4_classes_structs/4_out_param_1.cs create mode 100644 4_classes_structs/4_override_1.cs create mode 100644 4_classes_structs/4_override_2.cs create mode 100644 4_classes_structs/4_param_array_1.cs create mode 100644 4_classes_structs/4_partial_methods_1a.cs create mode 100644 4_classes_structs/4_partial_methods_1b.cs create mode 100644 4_classes_structs/4_properties_1.cs create mode 100644 4_classes_structs/4_properties_2.cs create mode 100644 4_classes_structs/4_properties_3.cs create mode 100644 4_classes_structs/4_properties_4.cs create mode 100644 4_classes_structs/4_readonly_1.cs create mode 100644 4_classes_structs/4_ref_param_1.cs create mode 100644 4_classes_structs/4_ref_param_2.cs create mode 100644 4_classes_structs/4_specialization_1.cs create mode 100644 4_classes_structs/4_static_class_1.cs create mode 100644 4_classes_structs/4_static_ctor_1.cs create mode 100644 4_classes_structs/4_static_field_example_1.cs create mode 100644 4_classes_structs/4_static_method_1.cs create mode 100644 4_classes_structs/4_struct_this_1.cs create mode 100644 4_classes_structs/4_struct_this_2.cs create mode 100644 4_classes_structs/4_struct_this_3.cs create mode 100644 4_classes_structs/4_struct_this_4.cs create mode 100644 4_classes_structs/4_types_vs_class.cs create mode 100644 4_classes_structs/anonymous_types_1.cs create mode 100644 4_classes_structs/anonymous_types_2.cs create mode 100644 4_classes_structs/obj_initializer_1.cs create mode 100644 4_classes_structs/obj_initializer_2.cs create mode 100644 4_classes_structs/obj_initializer_3.cs create mode 100644 5_interfaces/abstract_1.cs create mode 100644 5_interfaces/abstract_2.cs create mode 100644 5_interfaces/crazy_1.cs create mode 100644 5_interfaces/diamond_1.cs create mode 100644 5_interfaces/diamond_2.cs create mode 100644 5_interfaces/diamond_3.cs create mode 100644 5_interfaces/diamond_4.cs create mode 100644 5_interfaces/diamond_5.cs create mode 100644 5_interfaces/diamond_6.cs create mode 100644 5_interfaces/iface_1.cs create mode 100644 5_interfaces/iface_2.cs create mode 100644 5_interfaces/method_search_1.cs create mode 100644 5_interfaces/value_type_1.cs create mode 100644 5_interfaces/value_type_2.cs create mode 100644 5_interfaces/zoo_1.cs create mode 100644 5_interfaces/zoo_2.cs create mode 100644 6_operators/6_complex_1.cs create mode 100644 6_operators/6_complex_2.cs create mode 100644 6_operators/6_complex_3.cs create mode 100644 6_operators/6_complex_4.cs create mode 100644 6_operators/6_complex_5.cs create mode 100644 6_operators/6_invalid_use_1.cs create mode 100644 7_exception_safety/7_employee_database_1.cs create mode 100644 7_exception_safety/7_employee_database_2.cs create mode 100644 7_exception_safety/7_employee_database_3.cs create mode 100644 7_exception_safety/7_employee_database_4.cs create mode 100644 7_exception_safety/7_employee_database_4a.cs create mode 100644 7_exception_safety/7_employee_database_5.cs create mode 100644 7_exception_safety/7_exception_syntax_1.cs create mode 100644 7_exception_safety/7_exception_syntax_2.cs create mode 100644 7_exception_safety/7_exception_syntax_2a.cs create mode 100644 7_exception_safety/7_exception_syntax_3.cs create mode 100644 7_exception_safety/7_exception_syntax_4.cs create mode 100644 7_exception_safety/7_exception_syntax_5.cs create mode 100644 7_exception_safety/7_rollback_1.cs create mode 100644 7_exception_safety/7_safe_handle_1.cs create mode 100644 7_exception_safety/7_using_1.cs create mode 100644 7_exception_safety/7_using_2.cs create mode 100644 7_exception_safety/7_using_3.cs create mode 100644 8_strings/8_carib_1.cs create mode 100644 8_strings/8_carib_2.cs create mode 100644 8_strings/8_complex_1.cs create mode 100644 8_strings/8_complex_2.cs create mode 100644 8_strings/8_encoding_1.cs create mode 100644 8_strings/8_formatting_1.cs create mode 100644 8_strings/8_formatting_2.cs create mode 100644 8_strings/8_regex_1.cs create mode 100644 8_strings/8_regex_2.cs create mode 100644 8_strings/8_regex_3.cs create mode 100644 8_strings/8_regex_4.cs create mode 100644 8_strings/8_regex_5.cs create mode 100644 8_strings/8_regex_6.cs create mode 100644 8_strings/8_regex_7.cs create mode 100644 8_strings/8_regex_7a.cs create mode 100644 8_strings/8_regex_8.cs create mode 100644 8_strings/8_string_literals_1.cs create mode 100644 8_strings/8_stringbuilder_1.cs create mode 100644 8_strings/x-en-US-metric.ldml create mode 100644 9781590598733.jpg create mode 100644 9_arrays_collections/9_array_1.cs create mode 100644 9_arrays_collections/9_array_2.cs create mode 100644 9_arrays_collections/9_bidirectional_iterator_1.cs create mode 100644 9_arrays_collections/9_circular_iterator_1.cs create mode 100644 9_arrays_collections/9_enumerable_1.cs create mode 100644 9_arrays_collections/9_jagged_1.cs create mode 100644 9_arrays_collections/9_multidim_1.cs create mode 100644 9_arrays_collections/9_multidim_2.cs create mode 100644 9_arrays_collections/9_my_collection_1.cs create mode 100644 9_arrays_collections/9_mycoll_1.cs create mode 100644 9_arrays_collections/9_mycoll_2.cs create mode 100644 9_arrays_collections/9_mycoll_3.cs create mode 100644 9_arrays_collections/9_mycoll_4.cs create mode 100644 9_arrays_collections/9_mycoll_5.cs create mode 100644 9_arrays_collections/9_reverse_iterator_1.cs create mode 100644 9_arrays_collections/9_vector_1.cs create mode 100644 9_arrays_collections/coll_initializer_1.cs create mode 100644 9_arrays_collections/implicitly_typed_arrays_1.cs create mode 100644 9_arrays_collections/implicitly_typed_arrays_2.cs create mode 100644 9_arrays_collections/implicitly_typed_arrays_3.cs create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 README_FIRST.html create mode 100644 build.proj create mode 100644 contributing.md create mode 100644 intro_to_c_sharp/hello_world.cs create mode 100644 intro_to_c_sharp/hello_world_2.cs diff --git a/10_delegates/anonymous_1.cs b/10_delegates/anonymous_1.cs new file mode 100644 index 0000000..5cef195 --- /dev/null +++ b/10_delegates/anonymous_1.cs @@ -0,0 +1,56 @@ +using System; + +public delegate int ProcStrategy( int x ); + +public class Processor +{ + private ProcStrategy strategy; + public ProcStrategy Strategy { + set { + strategy = value; + } + } + + public int[] Process( int[] array ) { + int[] result = new int[ array.Length ]; + for( int i = 0; i < array.Length; ++i ) { + result[i] = strategy( array[i] ); + } + return result; + } +} + +public class EntryPoint +{ + private static int MultiplyBy2( int x ) { + return x*2; + } + + private static int MultiplyBy4( int x ) { + return x*4; + } + + private static void PrintArray( int[] array ) { + for( int i = 0; i < array.Length; ++i ) { + Console.Write( "{0}", array[i] ); + if( i != array.Length-1 ) { + Console.Write( ", " ); + } + } + Console.Write( "\n" ); + } + + static void Main() { + // Create an array of integers. + int[] integers = new int[] { + 1, 2, 3, 4 + }; + + Processor proc = new Processor(); + proc.Strategy = new ProcStrategy( EntryPoint.MultiplyBy2 ); + PrintArray( proc.Process(integers) ); + + proc.Strategy = new ProcStrategy( EntryPoint.MultiplyBy4 ); + PrintArray( proc.Process(integers) ); + } +} diff --git a/10_delegates/anonymous_2.cs b/10_delegates/anonymous_2.cs new file mode 100644 index 0000000..5cf3311 --- /dev/null +++ b/10_delegates/anonymous_2.cs @@ -0,0 +1,57 @@ +using System; + +public delegate int ProcStrategy( int x ); + +public class Processor +{ + private ProcStrategy strategy; + public ProcStrategy Strategy { + set { + strategy = value; + } + } + + public int[] Process( int[] array ) { + int[] result = new int[ array.Length ]; + for( int i = 0; i < array.Length; ++i ) { + result[i] = strategy( array[i] ); + } + return result; + } +} + +public class EntryPoint +{ + private static void PrintArray( int[] array ) { + for( int i = 0; i < array.Length; ++i ) { + Console.Write( "{0}", array[i] ); + if( i != array.Length-1 ) { + Console.Write( ", " ); + } + } + Console.Write( "\n" ); + } + + static void Main() { + // Create an array of integers. + int[] integers = new int[] { + 1, 2, 3, 4 + }; + + Processor proc = new Processor(); + proc.Strategy = delegate(int x) { + return x*2; + }; + PrintArray( proc.Process(integers) ); + + proc.Strategy = delegate(int x) { + return x*4; + }; + PrintArray( proc.Process(integers) ); + + proc.Strategy = delegate { + return 0; + }; + PrintArray( proc.Process(integers) ); + } +} diff --git a/10_delegates/anonymous_3.cs b/10_delegates/anonymous_3.cs new file mode 100644 index 0000000..f5329dd --- /dev/null +++ b/10_delegates/anonymous_3.cs @@ -0,0 +1,75 @@ +using System; + +public delegate int ProcStrategy( int x ); + +public class Processor +{ + private ProcStrategy strategy; + public ProcStrategy Strategy { + set { strategy = value; } + } + + public int[] Process( int[] array ) { + int[] result = new int[ array.Length ]; + for( int i = 0; i < array.Length; ++i ) { + result[i] = strategy( array[i] ); + } + return result; + } +} + +public class Factor +{ + public Factor( int fact ) { + this.fact = fact; + } + + private int fact; + + public ProcStrategy Multiplier { + get { + // This is an anonymous method. + return delegate(int x) { + return x*fact; + }; + } + } + + public ProcStrategy Adder { + get { + // This is an anonymous method. + return delegate(int x) { + return x+fact; + }; + } + } +} + +public class EntryPoint +{ + private static void PrintArray( int[] array ) { + for( int i = 0; i < array.Length; ++i ) { + Console.Write( "{0}", array[i] ); + if( i != array.Length-1 ) { + Console.Write( ", " ); + } + } + Console.Write( "\n" ); + } + + static void Main() { + // Create an array of integers. + int[] integers = new int[] { + 1, 2, 3, 4 + }; + + Factor factor = new Factor( 2 ); + Processor proc = new Processor(); + proc.Strategy = factor.Multiplier; + PrintArray( proc.Process(integers) ); + + proc.Strategy = factor.Adder; + factor = null; + PrintArray( proc.Process(integers) ); + } +} diff --git a/10_delegates/basic_use_1.cs b/10_delegates/basic_use_1.cs new file mode 100644 index 0000000..6f62cc4 --- /dev/null +++ b/10_delegates/basic_use_1.cs @@ -0,0 +1,44 @@ +using System; + +public delegate double ProcessResults( double x, + double y ); + +public class Processor +{ + public Processor( double factor ) { + this.factor = factor; + } + + public double Compute( double x, double y ) { + double result = (x+y)*factor; + Console.WriteLine( "InstanceResults: {0}", result ); + return result; + } + + public static double StaticCompute( double x, + double y ) { + double result = (x+y)*0.5; + Console.WriteLine( "StaticResult: {0}", result ); + return result; + } + + private double factor; +} + +public class EntryPoint +{ + static void Main() { + Processor proc1 = new Processor( 0.75 ); + Processor proc2 = new Processor( 0.83 ); + + ProcessResults delegate1 = new ProcessResults( proc1.Compute ); + ProcessResults delegate2 = new ProcessResults( proc2.Compute ); + ProcessResults delegate3 = new ProcessResults( Processor.StaticCompute ); + + double combined = delegate1( 4, 5 ) + + delegate2( 6, 2 ) + + delegate3( 5, 2 ); + + Console.WriteLine( "Output: {0}", combined ); + } +} diff --git a/10_delegates/binder_1.cs b/10_delegates/binder_1.cs new file mode 100644 index 0000000..73c1a3a --- /dev/null +++ b/10_delegates/binder_1.cs @@ -0,0 +1,39 @@ +using System; + +public delegate int Operation( int x, int y ); + +public class Bind2nd +{ + public delegate int BoundDelegate( int x ); + + public Bind2nd( Operation del, int arg2 ) { + this.del = del; + this.arg2 = arg2; + } + + public BoundDelegate Binder { + get { + return delegate( int arg1 ) { + return del( arg1, arg2 ); + }; + } + } + + private Operation del; + private int arg2; +} + +public class EntryPoint +{ + static int Add( int x, int y ) { + return x + y; + } + + static void Main() { + Bind2nd binder = new Bind2nd( + new Operation(EntryPoint.Add), + 4 ); + + Console.WriteLine( binder.Binder(2) ); + } +} diff --git a/10_delegates/binder_2.cs b/10_delegates/binder_2.cs new file mode 100644 index 0000000..2247ed5 --- /dev/null +++ b/10_delegates/binder_2.cs @@ -0,0 +1,40 @@ +using System; + +public delegate int Operation( int x, int y ); + +// WILL NOT COMPILE !!! +public class Bind2nd< DelegateType > +{ + public delegate int BoundDelegate( int x ); + + public Bind2nd( DelegateType del, int arg2 ) { + this.del = del; + this.arg2 = arg2; + } + + public BoundDelegate Binder { + get { + return delegate( int arg1 ) { + return del( arg1, arg2 ); // OUCH! + }; + } + } + + private DelegateType del; + private int arg2; +} + +public class EntryPoint +{ + static int Add( int x, int y ) { + return x + y; + } + + static void Main() { + Bind2nd binder = new Bind2nd( + new Operation(EntryPoint.Add), + 4 ); + + Console.WriteLine( binder.Binder(2) ); + } +} diff --git a/10_delegates/binder_3.cs b/10_delegates/binder_3.cs new file mode 100644 index 0000000..98625ff --- /dev/null +++ b/10_delegates/binder_3.cs @@ -0,0 +1,41 @@ +using System; + +public delegate int Operation( int x, int y ); + +// STILL WILL NOT COMPILE !!! +public class Bind2nd< DelegateType > + where DelegateType : Delegate +{ + public delegate int BoundDelegate( int x ); + + public Bind2nd( DelegateType del, int arg2 ) { + this.del = del; + this.arg2 = arg2; + } + + public BoundDelegate Binder { + get { + return delegate( int arg1 ) { + return del( arg1, arg2 ); // OUCH! + }; + } + } + + private DelegateType del; + private int arg2; +} + +public class EntryPoint +{ + static int Add( int x, int y ) { + return x + y; + } + + static void Main() { + Bind2nd binder = new Bind2nd( + new Operation(EntryPoint.Add), + 4 ); + + Console.WriteLine( binder.Binder(2) ); + } +} diff --git a/10_delegates/binder_4.cs b/10_delegates/binder_4.cs new file mode 100644 index 0000000..b362e22 --- /dev/null +++ b/10_delegates/binder_4.cs @@ -0,0 +1,59 @@ +using System; +using System.Reflection; + +public delegate int Operation( int x, int y ); + +public class Bind2nd +{ + public delegate ReturnType UnboundDelegate( UBArg1Type arg1, UBArg2Type arg2 ); + public delegate ReturnType BoundDelegate( BArg1Type x ); + + public Bind2nd( Delegate del, Arg2Type arg2 ) { + // Get the types from the delegate. + object target = del.Target; + MethodInfo targetMethod = del.Method; + Type targetType = targetMethod.ReflectedType; + + if( target == null ) { + // Static method + this.del = (UnboundDelegate) Delegate.CreateDelegate( + typeof(UnboundDelegate), + targetType, + targetMethod.Name ); + + } else { + // Instance method + this.del = (UnboundDelegate) Delegate.CreateDelegate( + typeof(UnboundDelegate), + target, + targetMethod.Name ); + } + this.arg2 = arg2; + } + + public BoundDelegate Binder { + get { + return delegate( Arg1Type arg1 ) { + return del( arg1, arg2 ); + }; + } + } + + private UnboundDelegate del; + private Arg2Type arg2; +} + +public class EntryPoint +{ + static int Add( int x, int y ) { + return x + y; + } + + static void Main() { + Bind2nd binder = new Bind2nd( + new Operation(EntryPoint.Add), + 4 ); + + Console.WriteLine( binder.Binder(2) ); + } +} diff --git a/10_delegates/capture_1.cs b/10_delegates/capture_1.cs new file mode 100644 index 0000000..c30252d --- /dev/null +++ b/10_delegates/capture_1.cs @@ -0,0 +1,25 @@ +using System; + +public delegate void PrintAndIncrement(); + +public class EntryPoint +{ + public static PrintAndIncrement[] CreateDelegates() { + PrintAndIncrement[] delegates = new PrintAndIncrement[3]; + int someVariable = 0; + int anotherVariable = 1; + for( int i = 0; i < 3; ++i ) { + delegates[i] = delegate { + Console.WriteLine( someVariable++ ); + }; + } + return delegates; + } + + static void Main() { + PrintAndIncrement[] delegates = CreateDelegates(); + for( int i = 0; i < 3; ++i ) { + delegates[i](); + } + } +} diff --git a/10_delegates/capture_2.cs b/10_delegates/capture_2.cs new file mode 100644 index 0000000..0691650 --- /dev/null +++ b/10_delegates/capture_2.cs @@ -0,0 +1,24 @@ +using System; + +public delegate void PrintAndIncrement(); + +public class EntryPoint +{ + public static PrintAndIncrement[] CreateDelegates() { + PrintAndIncrement[] delegates = new PrintAndIncrement[3]; + for( int i = 0; i < 3; ++i ) { + int someVariable = 0; + delegates[i] = delegate { + Console.WriteLine( someVariable++ ); + }; + } + return delegates; + } + + static void Main() { + PrintAndIncrement[] delegates = CreateDelegates(); + for( int i = 0; i < 3; ++i ) { + delegates[i](); + } + } +} diff --git a/10_delegates/chained_1.cs b/10_delegates/chained_1.cs new file mode 100644 index 0000000..788e1b0 --- /dev/null +++ b/10_delegates/chained_1.cs @@ -0,0 +1,46 @@ +using System; + +public delegate double ProcessResults( double x, + double y ); + +public class Processor +{ + public Processor( double factor ) { + this.factor = factor; + } + + public double Compute( double x, double y ) { + double result = (x+y)*factor; + Console.WriteLine( "InstanceResults: {0}", result ); + return result; + } + + public static double StaticCompute( double x, + double y ) { + double result = (x+y)*0.5; + Console.WriteLine( "StaticResult: {0}", result ); + return result; + } + + private double factor; +} + +public class EntryPoint +{ + static void Main() { + Processor proc1 = new Processor( 0.75 ); + Processor proc2 = new Processor( 0.83 ); + + ProcessResults[] delegates = new ProcessResults[] { + new ProcessResults( proc1.Compute ), + new ProcessResults( proc2.Compute ), + new ProcessResults( Processor.StaticCompute ) + }; + + ProcessResults chained = (ProcessResults) Delegate.Combine( delegates ); + + double combined = chained( 4, 5 ); + + Console.WriteLine( "Output: {0}", combined ); + } +} diff --git a/10_delegates/chained_2.cs b/10_delegates/chained_2.cs new file mode 100644 index 0000000..4cb900b --- /dev/null +++ b/10_delegates/chained_2.cs @@ -0,0 +1,50 @@ +using System; + +public delegate double ProcessResults( double x, + double y ); + +public class Processor +{ + public Processor( double factor ) { + this.factor = factor; + } + + public double Compute( double x, double y ) { + double result = (x+y)*factor; + Console.WriteLine( "InstanceResults: {0}", result ); + return result; + } + + public static double StaticCompute( double x, + double y ) { + double result = (x+y)*0.5; + Console.WriteLine( "StaticResult: {0}", result ); + return result; + } + + private double factor; +} + +public class EntryPoint +{ + static void Main() { + Processor proc1 = new Processor( 0.75 ); + Processor proc2 = new Processor( 0.83 ); + + ProcessResults[] delegates = new ProcessResults[] { + new ProcessResults( proc1.Compute ), + new ProcessResults( proc2.Compute ), + new ProcessResults( Processor.StaticCompute ) + }; + + ProcessResults chained = (ProcessResults) Delegate.Combine( delegates ); + Delegate[] chain = chained.GetInvocationList(); + double accumulator = 0; + for( int i = 0; i < chain.Length; ++i ) { + ProcessResults current = (ProcessResults) chain[i]; + accumulator += current( 4, 5 ); + } + + Console.WriteLine( "Output: {0}", accumulator ); + } +} diff --git a/10_delegates/events_1.cs b/10_delegates/events_1.cs new file mode 100644 index 0000000..b88ef7c --- /dev/null +++ b/10_delegates/events_1.cs @@ -0,0 +1,58 @@ +using System; + +// Arguments passed from UI when play event occurs. +public class PlayEventArgs : EventArgs +{ + public PlayEventArgs( string filename ) { + this.filename = filename; + } + + private string filename; + public string Filename { + get { return filename; } + } +} + +public class PlayerUI +{ + // define event for play notifications. + public event EventHandler PlayEvent; + + public void UserPressedPlay() { + OnPlay(); + } + + protected virtual void OnPlay() { + // fire the event. + EventHandler localHandler + = PlayEvent; + if( localHandler != null ) { + localHandler( this, + new PlayEventArgs("somefile.wav") ); + } + } +} + +public class CorePlayer +{ + public CorePlayer() { + ui = new PlayerUI(); + + // Register our event handler. + ui.PlayEvent += this.PlaySomething; + } + + private void PlaySomething( object source, + PlayEventArgs args ) { + // Play the file. + } + + private PlayerUI ui; +} + +public class EntryPoint +{ + static void Main() { + CorePlayer player = new CorePlayer(); + } +} diff --git a/10_delegates/events_2.cs b/10_delegates/events_2.cs new file mode 100644 index 0000000..55fbba5 --- /dev/null +++ b/10_delegates/events_2.cs @@ -0,0 +1,68 @@ +using System; + +// Arguments passed from UI when play event occurs. +public class PlayEventArgs : EventArgs +{ + public PlayEventArgs( string filename ) { + this.filename = filename; + } + + private string filename; + public string Filename { + get { return filename; } + } +} + +public class PlayerUI +{ + // define event for play notifications. + private EventHandler playEvent; + public event EventHandler PlayEvent { + add { + playEvent = (EventHandler) + Delegate.Combine( playEvent, value ); + } + remove { + playEvent = (EventHandler) + Delegate.Remove( playEvent, value ); + } + } + + public void UserPressedPlay() { + OnPlay(); + } + + protected virtual void OnPlay() { + // fire the event. + EventHandler localHandler + = playEvent; + if( localHandler != null ) { + localHandler( this, + new PlayEventArgs("somefile.wav") ); + } + } +} + +public class CorePlayer +{ + public CorePlayer() { + ui = new PlayerUI(); + + // Register our event handler. + ui.PlayEvent += this.PlaySomething; + } + + private void PlaySomething( object source, + PlayEventArgs args ) { + // Play the file. + } + + private PlayerUI ui; +} + +public class EntryPoint +{ + static void Main() { + CorePlayer player = new CorePlayer(); + } +} diff --git a/10_delegates/open_instance_1.cs b/10_delegates/open_instance_1.cs new file mode 100644 index 0000000..981eb95 --- /dev/null +++ b/10_delegates/open_instance_1.cs @@ -0,0 +1,53 @@ +using System; +using System.Reflection; +using System.Collections.Generic; + +delegate void ApplyRaiseDelegate( Employee emp, + Decimal percent ); + +public class Employee +{ + private Decimal salary; + + public Employee( Decimal salary ) { + this.salary = salary; + } + + public Decimal Salary { + get { + return salary; + } + } + + public void ApplyRaiseOf( Decimal percent ) { + salary *= (1 + percent); + } +} + +public class EntryPoint +{ + static void Main() { + List employees = new List(); + + employees.Add( new Employee(40000) ); + employees.Add( new Employee(65000) ); + employees.Add( new Employee(95000) ); + + // Create open instance delegate + MethodInfo mi = + typeof(Employee).GetMethod( "ApplyRaiseOf", + BindingFlags.Public | + BindingFlags.Instance ); + ApplyRaiseDelegate applyRaise = (ApplyRaiseDelegate ) + Delegate.CreateDelegate( typeof(ApplyRaiseDelegate), + mi ); + + // Apply raise. + foreach( Employee e in employees ) { + applyRaise( e, (Decimal) 0.10 ); + + // Send new salary to console. + Console.WriteLine( e.Salary ); + } + } +} diff --git a/10_delegates/open_instance_2.cs b/10_delegates/open_instance_2.cs new file mode 100644 index 0000000..abd9b44 --- /dev/null +++ b/10_delegates/open_instance_2.cs @@ -0,0 +1,55 @@ +using System; +using System.Reflection; +using System.Collections.Generic; + +delegate void ApplyRaiseDelegate( T instance, + Decimal percent ); + +public class Employee +{ + private Decimal salary; + + public Employee( Decimal salary ) { + this.salary = salary; + } + + public Decimal Salary { + get { + return salary; + } + } + + public void ApplyRaiseOf( Decimal percent ) { + salary *= (1 + percent); + } +} + +public class EntryPoint +{ + static void Main() { + List employees = new List(); + + employees.Add( new Employee(40000) ); + employees.Add( new Employee(65000) ); + employees.Add( new Employee(95000) ); + + // Create open instance delegate + MethodInfo mi = + typeof(Employee).GetMethod( "ApplyRaiseOf", + BindingFlags.Public | + BindingFlags.Instance ); + ApplyRaiseDelegate applyRaise = + (ApplyRaiseDelegate ) + Delegate.CreateDelegate( + typeof(ApplyRaiseDelegate), + mi ); + + // Apply raise. + foreach( Employee e in employees ) { + applyRaise( e, (Decimal) 0.10 ); + + // Send new salary to console. + Console.WriteLine( e.Salary ); + } + } +} diff --git a/10_delegates/strategy_1.cs b/10_delegates/strategy_1.cs new file mode 100644 index 0000000..283f44b --- /dev/null +++ b/10_delegates/strategy_1.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections; + +public delegate Array SortStrategy( ICollection theCollection ); + +public class Consumer +{ + public Consumer( SortStrategy defaultStrategy ) { + this.strategy = defaultStrategy; + } + + private SortStrategy strategy; + public SortStrategy Strategy { + get { return strategy; } + set { strategy = value; } + } + + public void DoSomeWork() { + // Employ the strategy. + Array sorted = strategy( myCollection ); + + // Do something with the results. + } + + private ArrayList myCollection; +} + +public class SortAlgorithms +{ + static Array SortFast( ICollection theCollection ) { + // Do the fast sort. + } + + static Array SortSlow( ICollection theCollection ) { + // Do the slow sort. + } +} diff --git a/11_generics/10_constraints_1.cs b/11_generics/10_constraints_1.cs new file mode 100644 index 0000000..bf4b64f --- /dev/null +++ b/11_generics/10_constraints_1.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +public interface IShape +{ + double Area { + get; + } +} + +public class Circle : IShape +{ + public Circle( double radius ) { + this.radius = radius; + } + + public double Area { + get { + return 3.1415*radius*radius; + } + } + + private double radius; +} + +public class Rect : IShape +{ + public Rect( double width, double height ) { + this.width = width; + this.height = height; + } + + public double Area { + get { + return width*height; + } + } + + private double width; + private double height; +} + +public class Shapes +{ + public double TotalArea { + get { + double acc = 0; + foreach( T shape in shapes ) { + // THIS WON'T COMPILE!!! + acc += shape.Area; + } + return acc; + } + } + + public void Add( T shape ) { + shapes.Add( shape ); + } + + private List shapes = new List(); +} + +public class EntryPoint +{ + static void Main() { + Shapes shapes = new Shapes(); + + shapes.Add( new Circle(2) ); + shapes.Add( new Rect(3, 5) ); + + Console.WriteLine( "Total Area: {0}", + shapes.TotalArea ); + } +} diff --git a/11_generics/10_constraints_2.cs b/11_generics/10_constraints_2.cs new file mode 100644 index 0000000..dc7eb87 --- /dev/null +++ b/11_generics/10_constraints_2.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; + +public interface IShape +{ + double Area { + get; + } +} + +public class Circle : IShape +{ + public Circle( double radius ) { + this.radius = radius; + } + + public double Area { + get { + return 3.1415*radius*radius; + } + } + + private double radius; +} + +public class Rect : IShape +{ + public Rect( double width, double height ) { + this.width = width; + this.height = height; + } + + public double Area { + get { + return width*height; + } + } + + private double width; + private double height; +} + +public class Shapes +{ + public double TotalArea { + get { + double acc = 0; + foreach( T shape in shapes ) { + // DON'T DO THIS!!! + IShape theShape = (IShape) shape; + acc += theShape.Area; + } + return acc; + } + } + + public void Add( T shape ) { + shapes.Add( shape ); + } + + private List shapes = new List(); +} + +public class EntryPoint +{ + static void Main() { + Shapes shapes = new Shapes(); + + shapes.Add( new Circle(2) ); + shapes.Add( new Rect(3, 5) ); + + Console.WriteLine( "Total Area: {0}", + shapes.TotalArea ); + } +} diff --git a/11_generics/10_constraints_3.cs b/11_generics/10_constraints_3.cs new file mode 100644 index 0000000..c892160 --- /dev/null +++ b/11_generics/10_constraints_3.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; + +public interface IShape +{ + double Area { + get; + } +} + +public class Circle : IShape +{ + public Circle( double radius ) { + this.radius = radius; + } + + public double Area { + get { + return 3.1415*radius*radius; + } + } + + private double radius; +} + +public class Rect : IShape +{ + public Rect( double width, double height ) { + this.width = width; + this.height = height; + } + + public double Area { + get { + return width*height; + } + } + + private double width; + private double height; +} + +public class Shapes + where T: IShape +{ + public double TotalArea { + get { + double acc = 0; + foreach( T shape in shapes ) { + acc += shape.Area; + } + return acc; + } + } + + public void Add( T shape ) { + shapes.Add( shape ); + } + + private List shapes = new List(); +} + +public class EntryPoint +{ + static void Main() { + Shapes shapes = new Shapes(); + + shapes.Add( new Circle(2) ); + shapes.Add( new Rect(3, 5) ); + + Console.WriteLine( "Total Area: {0}", + shapes.TotalArea ); + } +} diff --git a/11_generics/10_constraints_examples_1.cs b/11_generics/10_constraints_examples_1.cs new file mode 100644 index 0000000..11debb9 --- /dev/null +++ b/11_generics/10_constraints_examples_1.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +public class MyValueList + where T: struct +// But can't do the following +// where T: struct, new() +{ + public void Add( T v ) { + imp.Add( v ); + } + + private List imp = new List(); +} + +public class EntryPoint +{ + static void Main() { + MyValueList intList = + new MyValueList(); + + intList.Add( 123 ); + + // CAN'T DO THIS. + // MyValueList objList = + // new MyValueList(); + } +} diff --git a/11_generics/10_constraints_examples_2.cs b/11_generics/10_constraints_examples_2.cs new file mode 100644 index 0000000..12a63d3 --- /dev/null +++ b/11_generics/10_constraints_examples_2.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +public interface IValue +{ + // IValue methods. +} + +public class MyDictionary + where TKey: struct, IComparable + where TValue: IValue, new() +{ + public void Add( TKey key, TValue val ) { + imp.Add( key, val ); + } + + private Dictionary imp + = new Dictionary(); +} diff --git a/11_generics/10_default_value_1.cs b/11_generics/10_default_value_1.cs new file mode 100644 index 0000000..3750440 --- /dev/null +++ b/11_generics/10_default_value_1.cs @@ -0,0 +1,40 @@ +using System; + +public class MyContainer +{ + public MyContainer() { + // Create initial capacity. + imp = new T[ 4 ]; + for( int i = 0; i < imp.Length; ++i ) { + imp[i] = default(T); + } + } + + public bool IsNull( int i ) { + if( i < 0 || i >= imp.Length ) { + throw new ArgumentOutOfRangeException(); + } + + if( imp[i] == null ) { + return true; + } else { + return false; + } + } + + private T[] imp; +} + +public class EntryPoint +{ + static void Main() { + MyContainer intColl = + new MyContainer(); + + MyContainer objColl = + new MyContainer(); + + Console.WriteLine( intColl.IsNull(0) ); + Console.WriteLine( objColl.IsNull(0) ); + } +} diff --git a/11_generics/10_default_value_2.cs b/11_generics/10_default_value_2.cs new file mode 100644 index 0000000..e047f78 --- /dev/null +++ b/11_generics/10_default_value_2.cs @@ -0,0 +1,40 @@ +using System; + +public class MyContainer +{ + public MyContainer() { + // Create initial capacity. + imp = new T[ 4 ]; + for( int i = 0; i < imp.Length; ++i ) { + imp[i] = default(T); + } + } + + public bool IsNull( int i ) { + if( i < 0 || i >= imp.Length ) { + throw new ArgumentOutOfRangeException(); + } + + if( Object.Equals(imp[i], default(T)) ) { + return true; + } else { + return false; + } + } + + private T[] imp; +} + +public class EntryPoint +{ + static void Main() { + MyContainer intColl = + new MyContainer(); + + MyContainer objColl = + new MyContainer(); + + Console.WriteLine( intColl.IsNull(0) ); + Console.WriteLine( objColl.IsNull(0) ); + } +} diff --git a/11_generics/10_delegate_constraint.cs b/11_generics/10_delegate_constraint.cs new file mode 100644 index 0000000..70b786d --- /dev/null +++ b/11_generics/10_delegate_constraint.cs @@ -0,0 +1,22 @@ +using System; + +public delegate R Operation( T1 val1, + T2 val2 ) + where T1: struct + where T2: struct + where R: struct; + +public class EntryPoint +{ + public static double Add( int val1, float val2 ) { + return val1 + val2; + } + + static void Main() { + Operation op = + new Operation( EntryPoint.Add ); + + Console.WriteLine( "{0} + {1} = {2}", + 1, 3.2, op(1, 3.2f) ); + } +} diff --git a/11_generics/10_dynamic_closed_1.cs b/11_generics/10_dynamic_closed_1.cs new file mode 100644 index 0000000..526134c --- /dev/null +++ b/11_generics/10_dynamic_closed_1.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + IList intList = + (IList) CreateClosedType( typeof(List<>) ); + + IList doubleList = + (IList) + CreateClosedType( typeof(List<>) ); + + Console.WriteLine( intList ); + Console.WriteLine( doubleList ); + } + + static object CreateClosedType( Type genericType ) { + Type[] typeArguments = { + typeof( T ) + }; + + Type closedType = + genericType.MakeGenericType( typeArguments ); + + return Activator.CreateInstance( closedType ); + } +} diff --git a/11_generics/10_enumerable_1.cs b/11_generics/10_enumerable_1.cs new file mode 100644 index 0000000..7efabf5 --- /dev/null +++ b/11_generics/10_enumerable_1.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; + +public class MyContainer : IEnumerable +{ + public void Add( T item ) { + impl.Add( item ); + } + + public void Add( MyContainer otherContainer, + Converter converter ) { + foreach( R item in otherContainer ) { + impl.Add( converter(item) ); + } + } + + public IEnumerator GetEnumerator() { + foreach( T item in impl ) { + yield return item; + } + } + + System.Collections.IEnumerator + System.Collections.IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private List impl = new List(); +} + diff --git a/11_generics/10_example_1.cs b/11_generics/10_example_1.cs new file mode 100644 index 0000000..865d9af --- /dev/null +++ b/11_generics/10_example_1.cs @@ -0,0 +1,7 @@ +public class MyCollection +{ + public MyCollection() { + } + + private T[] storage; +} diff --git a/11_generics/10_generic_accessibility_1.cs b/11_generics/10_generic_accessibility_1.cs new file mode 100644 index 0000000..50f3af7 --- /dev/null +++ b/11_generics/10_generic_accessibility_1.cs @@ -0,0 +1,13 @@ +public class Outer +{ + private class Nested + { + } + + public class GenericNested + { + } + + private GenericNested field1; + public GenericNested field2; // Ooops! +} diff --git a/11_generics/10_generic_delegate_1.cs b/11_generics/10_generic_delegate_1.cs new file mode 100644 index 0000000..422c54b --- /dev/null +++ b/11_generics/10_generic_delegate_1.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +public delegate void MyDelegate( T i ); + +public class DelegateContainer +{ + public void Add( MyDelegate del ) { + imp.Add( del ); + } + + public void CallDelegates( T k ) { + foreach( MyDelegate del in imp ) { + del( k ); + } + } + + private List > imp = new List >(); +} + +public class EntryPoint +{ + static void Main() { + DelegateContainer delegates = + new DelegateContainer(); + + delegates.Add( EntryPoint.PrintInt ); + delegates.CallDelegates( 42 ); + } + + static void PrintInt( int i ) { + Console.WriteLine( i ); + } +} diff --git a/11_generics/10_generic_problems_1.cs b/11_generics/10_generic_problems_1.cs new file mode 100644 index 0000000..e872c15 --- /dev/null +++ b/11_generics/10_generic_problems_1.cs @@ -0,0 +1,31 @@ +using System; + +public struct Complex + where T: struct +{ + public Complex( T real, T imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + private T real; + private T imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( 4, 5 ); + } +} diff --git a/11_generics/10_generic_problems_2.cs b/11_generics/10_generic_problems_2.cs new file mode 100644 index 0000000..3ab63a4 --- /dev/null +++ b/11_generics/10_generic_problems_2.cs @@ -0,0 +1,42 @@ +using System; + +public struct Complex + where T: struct +{ + public Complex( T real, T imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + public T Magnitude { + get { + // WON'T COMPILE!!! + return Math.Sqrt( real * real + + imaginary * imaginary ); + } + } + + private T real; + private T imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( 3, 4 ); + + Console.WriteLine( "Magnitude is {0}", + c.Magnitude ); + } +} diff --git a/11_generics/10_generic_problems_3.cs b/11_generics/10_generic_problems_3.cs new file mode 100644 index 0000000..f71b09d --- /dev/null +++ b/11_generics/10_generic_problems_3.cs @@ -0,0 +1,71 @@ +using System; + +public struct Complex + where T: struct, IConvertible +{ + // Delegate for doing multiplication. + public delegate T BinaryOp( T val1, T val2 ); + + public Complex( T real, T imaginary, + BinaryOp mult, + BinaryOp add, + Converter convToT ) { + this.real = real; + this.imaginary = imaginary; + this.mult = mult; + this.add = add; + this.convToT = convToT; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + public T Magnitude { + get { + double magnitude = + Math.Sqrt( Convert.ToDouble(add(mult(real, real), + mult(imaginary, imaginary))) ); + return convToT( magnitude ); + } + } + + private T real; + private T imaginary; + private BinaryOp mult; + private BinaryOp add; + private Converter convToT; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( + 3, 4, + EntryPoint.MultiplyInt64, + EntryPoint.AddInt64, + EntryPoint.DoubleToInt64 ); + + Console.WriteLine( "Magnitude is {0}", + c.Magnitude ); + } + + static Int64 MultiplyInt64( Int64 val1, Int64 val2 ) { + return val1 * val2; + } + + static Int64 AddInt64( Int64 val1, Int64 val2 ) { + return val1 + val2; + } + + static Int64 DoubleToInt64( double d ) { + return Convert.ToInt64( d ); + } +} diff --git a/11_generics/10_generic_problems_4.cs b/11_generics/10_generic_problems_4.cs new file mode 100644 index 0000000..9adbc06 --- /dev/null +++ b/11_generics/10_generic_problems_4.cs @@ -0,0 +1,75 @@ +using System; + +public struct Complex : IComparable > + where T: struct, IConvertible, IComparable +{ + // Delegate for doing multiplication. + public delegate T BinaryOp( T val1, T val2 ); + + public Complex( T real, T imaginary, + BinaryOp mult, + BinaryOp add, + Converter convToT ) { + this.real = real; + this.imaginary = imaginary; + this.mult = mult; + this.add = add; + this.convToT = convToT; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + public T Magnitude { + get { + double magnitude = + Math.Sqrt( Convert.ToDouble(add(mult(real, real), + mult(imaginary, imaginary))) ); + return convToT( magnitude ); + } + } + + public int CompareTo( Complex other ) { + return Magnitude.CompareTo( other.Magnitude ); + } + + private T real; + private T imaginary; + private BinaryOp mult; + private BinaryOp add; + private Converter convToT; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( + 3, 4, + EntryPoint.MultiplyInt64, + EntryPoint.AddInt64, + EntryPoint.DoubleToInt64 ); + + Console.WriteLine( "Magnitude is {0}", + c.Magnitude ); + } + + static Int64 MultiplyInt64( Int64 val1, Int64 val2 ) { + return val1 * val2; + } + + static Int64 AddInt64( Int64 val1, Int64 val2 ) { + return val1 + val2; + } + + static Int64 DoubleToInt64( double d ) { + return Convert.ToInt64( d ); + } +} diff --git a/11_generics/10_generic_problems_5.cs b/11_generics/10_generic_problems_5.cs new file mode 100644 index 0000000..4b4a7e2 --- /dev/null +++ b/11_generics/10_generic_problems_5.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; + +public struct Complex : IComparable > + where T: struct +{ + // Delegate for doing multiplication. + public delegate T BinaryOp( T val1, T val2 ); + + public Complex( T real, T imaginary, + BinaryOp mult, + BinaryOp add, + Converter convToT ) { + this.real = real; + this.imaginary = imaginary; + this.mult = mult; + this.add = add; + this.convToT = convToT; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + public T Magnitude { + get { + double magnitude = + Math.Sqrt( Convert.ToDouble(add(mult(real, real), + mult(imaginary, imaginary))) ); + return convToT( magnitude ); + } + } + + public int CompareTo( Complex other ) { + return Comparer.Default.Compare( this.Magnitude, other.Magnitude ); + } + + private T real; + private T imaginary; + private BinaryOp mult; + private BinaryOp add; + private Converter convToT; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( + 3, 4, + EntryPoint.MultiplyInt64, + EntryPoint.AddInt64, + EntryPoint.DoubleToInt64 ); + + Console.WriteLine( "Magnitude is {0}", + c.Magnitude ); + } + + static void DummyMethod( Complex > c ) { + } + + static Int64 AddInt64( Int64 val1, Int64 val2 ) { + return val1 + val2; + } + + static Int64 MultiplyInt64( Int64 val1, Int64 val2 ) { + return val1 * val2; + } + + static Int64 DoubleToInt64( double d ) { + return Convert.ToInt64( d ); + } +} diff --git a/11_generics/10_generic_problems_6.cs b/11_generics/10_generic_problems_6.cs new file mode 100644 index 0000000..d09cd48 --- /dev/null +++ b/11_generics/10_generic_problems_6.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; + +public struct Complex : IComparable > + where T: struct +{ + // Delegate for doing multiplication. + public delegate T BinaryOp( T val1, T val2 ); + + public Complex( T real, T imaginary, + BinaryOp mult, + BinaryOp add, + Converter convToDouble, + Converter convToT ) { + this.real = real; + this.imaginary = imaginary; + this.mult = mult; + this.add = add; + this.convToDouble = convToDouble; + this.convToT = convToT; + } + + public T Real { + get { return real; } + set { real = value; } + } + + public T Img { + get { return imaginary; } + set { imaginary = value; } + } + + public T Magnitude { + get { + double magnitude = + Math.Sqrt( convToDouble(add(mult(real, real), + mult(imaginary, imaginary))) ); + return convToT( magnitude ); + } + } + + public int CompareTo( Complex other ) { + return Comparer.Default.Compare( this.Magnitude, other.Magnitude ); + } + + private T real; + private T imaginary; + private BinaryOp mult; + private BinaryOp add; + private Converter convToDouble; + private Converter convToT; +} + +public class EntryPoint +{ + static void Main() { + Complex c = + new Complex( + 3, 4, + EntryPoint.MultiplyInt64, + EntryPoint.AddInt64, + EntryPoint.Int64ToDouble, + EntryPoint.DoubleToInt64 ); + + Console.WriteLine( "Magnitude is {0}", + c.Magnitude ); + } + + static void DummyMethod( Complex > c ) { + } + + static Int64 MultiplyInt64( Int64 val1, Int64 val2 ) { + return val1 * val2; + } + + static Int64 AddInt64( Int64 val1, Int64 val2 ) { + return val1 + val2; + } + + static Int64 DoubleToInt64( double d ) { + return Convert.ToInt64( d ); + } + + static double Int64ToDouble( Int64 i ) { + return Convert.ToDouble( i ); + } +} diff --git a/11_generics/10_generic_sorted_list_1.cs b/11_generics/10_generic_sorted_list_1.cs new file mode 100644 index 0000000..b9a1dbf --- /dev/null +++ b/11_generics/10_generic_sorted_list_1.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + SortedList list1 = + new SortedList(); + + SortedList list2 = + new SortedList( Comparer.Default ); + + list1.Add( 1, "one" ); + list1.Add( 2, "two" ); + list2.Add( 3, "three" ); + list2.Add( 4, "four" ); + } +} diff --git a/11_generics/10_generic_vs_nongeneric.cs b/11_generics/10_generic_vs_nongeneric.cs new file mode 100644 index 0000000..b5fe2e5 --- /dev/null +++ b/11_generics/10_generic_vs_nongeneric.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + } + + public void NonGeneric( Stack stack ) { + foreach( object o in stack ) { + int number = (int) o; + Console.WriteLine( number ); + } + } + + public void Generic( Stack stack ) { + foreach( int number in stack ) { + Console.WriteLine( number ); + } + } +} diff --git a/11_generics/10_needs_constraints.cs b/11_generics/10_needs_constraints.cs new file mode 100644 index 0000000..4e06522 --- /dev/null +++ b/11_generics/10_needs_constraints.cs @@ -0,0 +1,26 @@ +using System; + +public class ContainedClass +{ + public long GetSomeValue() { + return 42; + } +} + +public class MyClass +{ + public void DoSomething() { + Console.WriteLine( field1.GetHashCode() ); + Console.WriteLine( field1.GetSomeValue() ); + } + + private T field1; +} + +public class EntryPoint +{ + static void Main() { + MyClass obj1 = new MyClass(); + MyClass obj2 = new MyClass(); + } +} diff --git a/11_generics/10_no_delegate_for_type_argument.cs b/11_generics/10_no_delegate_for_type_argument.cs new file mode 100644 index 0000000..bf66161 --- /dev/null +++ b/11_generics/10_no_delegate_for_type_argument.cs @@ -0,0 +1,34 @@ +// THIS WON'T WORK AS EXPECTED!!! +using System; +using System.Collections.Generic; + +public delegate void MyDelegate( int i ); + +public class DelegateContainer +{ + public void Add( T del ) { + imp.Add( del ); + } + + public void CallDelegates( int k ) { + foreach( T del in imp ) { +// del( k ); + } + } + + private List imp = new List(); +} + +public class EntryPoint +{ + static void Main() { + DelegateContainer delegates = + new DelegateContainer(); + + delegates.Add( EntryPoint.PrintInt ); + } + + static void PrintInt( int i ) { + Console.WriteLine( i ); + } +} diff --git a/11_generics/10_nullable_1.cs b/11_generics/10_nullable_1.cs new file mode 100644 index 0000000..1120e9f --- /dev/null +++ b/11_generics/10_nullable_1.cs @@ -0,0 +1,40 @@ +using System; + +public class Employee +{ + public Employee( string firstName, + string lastName ) { + this.firstName = firstName; + this.lastName = lastName; + + this.terminationDate = null; + this.ssn = default(Nullable); + } + + public string firstName; + public string lastName; + + public Nullable terminationDate; + public long? ssn; // Shorthand notation +} + +public class EntryPoint +{ + static void Main() { + Employee emp = new Employee( "Vasya", + "Pupkin" ); + emp.ssn = 1234567890; + + Console.WriteLine( "{0} {1}", + emp.firstName, + emp.lastName ); + if( emp.terminationDate.HasValue ) { + Console.WriteLine( "Start Date: {0}", + emp.terminationDate ); + } + + long tempSSN = emp.ssn ?? -1; + Console.WriteLine( "SSN: {0}", + tempSSN ); + } +} diff --git a/11_generics/10_template_derivation.cpp b/11_generics/10_template_derivation.cpp new file mode 100644 index 0000000..63f3d77 --- /dev/null +++ b/11_generics/10_template_derivation.cpp @@ -0,0 +1,24 @@ +class Employee +{ + public: + long get_salary() { + return salary; + } + void set_salary( long salary ) { + this->salary = salary; + } + + private: + long salary; +}; + +template< class T > +class MyClass : public T +{ +}; + +void main() +{ + MyClass myInstance; + myInstance.get_salary(); +} diff --git a/11_generics/10_template_method_1.cs b/11_generics/10_template_method_1.cs new file mode 100644 index 0000000..9d150b5 --- /dev/null +++ b/11_generics/10_template_method_1.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; + +public class MyContainer : IEnumerable +{ + public void Add( T item ) { + impl.Add( item ); + } + + // Converter is a new delegate type introduced + // in the .NET Framework that can be wired up to a method that + // knows how to convert the TInput type into a TOutput type. + public void Add( MyContainer otherContainer, + Converter converter ) { + foreach( R item in otherContainer ) { + impl.Add( converter(item) ); + } + } + + public IEnumerator GetEnumerator() { + foreach( T item in impl ) { + yield return item; + } + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private List impl = new List(); +} + +public class EntryPoint +{ + static void Main() { + MyContainer lContainer = new MyContainer(); + MyContainer iContainer = new MyContainer(); + + lContainer.Add( 1 ); + lContainer.Add( 2 ); + iContainer.Add( 3 ); + iContainer.Add( 4 ); + + lContainer.Add( iContainer, + EntryPoint.IntToLongConverter ); + + foreach( long l in lContainer ) { + Console.WriteLine( l ); + } + } + + static long IntToLongConverter( int i ) { + return i; + } +} diff --git a/12_threading/async_1.cs b/12_threading/async_1.cs new file mode 100644 index 0000000..9e742bd --- /dev/null +++ b/12_threading/async_1.cs @@ -0,0 +1,39 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + // Declare the delegate for the async call. + private delegate Decimal ComputeTaxesDelegate( int year ); + + // The method that computes the taxes. + private static Decimal ComputeTaxes( int year ) { + Console.WriteLine( "Computing taxes in thread {0}", + Thread.CurrentThread.GetHashCode() ); + + // Here's where the long calculation happens. + Thread.Sleep( 6000 ); + + // You owe the man. + return 4356.98M; + } + + static void Main() { + // Let's make the asynchronous call by creating + // the delegate and calling it. + ComputeTaxesDelegate work = + new ComputeTaxesDelegate( EntryPoint.ComputeTaxes ); + IAsyncResult pendingOp = work.BeginInvoke( 2004, + null, + null ); + + // Do some other useful work. + Thread.Sleep( 3000 ); + + // Finish the async call. + Console.WriteLine( "Waiting for operation to complete." ); + Decimal result = work.EndInvoke( pendingOp ); + + Console.WriteLine( "Taxes owed: {0}", result ); + } +} diff --git a/12_threading/async_2.cs b/12_threading/async_2.cs new file mode 100644 index 0000000..1311041 --- /dev/null +++ b/12_threading/async_2.cs @@ -0,0 +1,46 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + // Declare the delegate for the async call. + private delegate Decimal ComputeTaxesDelegate( int year ); + + // The method that computes the taxes. + private static Decimal ComputeTaxes( int year ) { + Console.WriteLine( "Computing taxes in thread {0}", + Thread.CurrentThread.GetHashCode() ); + + // Here's where the long calculation happens. + Thread.Sleep( 6000 ); + + // You owe the man. + return 4356.98M; + } + + private static void TaxesComputed( IAsyncResult ar ) { + // Let' get the results now. + ComputeTaxesDelegate work = + (ComputeTaxesDelegate) ar.AsyncState; + + Decimal result = work.EndInvoke( ar ); + Console.WriteLine( "Taxes owed: {0}", result ); + } + + static void Main() { + // Let's make the asynchronous call by creating + // the delegate and calling it. + ComputeTaxesDelegate work = + new ComputeTaxesDelegate( EntryPoint.ComputeTaxes ); + work.BeginInvoke( 2004, + new AsyncCallback( + EntryPoint.TaxesComputed), + work ); + + // Do some other useful work. + Thread.Sleep( 3000 ); + + Console.WriteLine( "Waiting for operation to complete." ); + Thread.Sleep( 4000 ); + } +} diff --git a/12_threading/async_3.cs b/12_threading/async_3.cs new file mode 100644 index 0000000..47ed373 --- /dev/null +++ b/12_threading/async_3.cs @@ -0,0 +1,41 @@ +using System; +using System.Text; +using System.Threading; +using System.Net; +using System.Net.Sockets; + +public class EntryPoint { + private const int CONNECT_QUEUE_LENGTH = 4; + private const int LISTEN_PORT = 1234; + + static void ListenForRequests() { + Socket listenSock = + new Socket( AddressFamily.InterNetwork, + SocketType.Stream, + ProtocolType.Tcp ); + listenSock.Bind( new IPEndPoint(IPAddress.Any, + LISTEN_PORT) ); + listenSock.Listen( CONNECT_QUEUE_LENGTH ); + + while( true ) { + using( Socket newConnection = listenSock.Accept() ) { + // Send the data. + byte[] msg = + Encoding.UTF8.GetBytes( "Hello World!" ); + newConnection.Send( msg, SocketFlags.None ); + } + } + } + + static void Main() { + // Start the listening thread. + Thread listener = new Thread( + new ThreadStart( + EntryPoint.ListenForRequests) ); + listener.IsBackground = true; + listener.Start(); + + Console.WriteLine( "Press to quit" ); + Console.ReadLine(); + } +} diff --git a/12_threading/async_4.cs b/12_threading/async_4.cs new file mode 100644 index 0000000..67f8a71 --- /dev/null +++ b/12_threading/async_4.cs @@ -0,0 +1,41 @@ +using System; +using System.Text; +using System.Threading; +using System.Net; +using System.Net.Sockets; + +public class EntryPoint { + private const int CONNECT_QUEUE_LENGTH = 4; + private const int LISTEN_PORT = 1234; + + static void ListenForRequests() { + Socket listenSock = + new Socket( AddressFamily.InterNetwork, + SocketType.Stream, + ProtocolType.Tcp ); + listenSock.Bind( new IPEndPoint(IPAddress.Any, + LISTEN_PORT) ); + listenSock.Listen( CONNECT_QUEUE_LENGTH ); + + while( true ) { + Socket newConnection = listenSock.Accept(); + byte[] msg = Encoding.UTF8.GetBytes( "Hello World!" ); + newConnection.BeginSend( msg, + 0, msg.Length, + SocketFlags.None, + null, null ); + } + } + + static void Main() { + // Start the listening thread. + Thread listener = new Thread( + new ThreadStart( + EntryPoint.ListenForRequests) ); + listener.IsBackground = true; + listener.Start(); + + Console.WriteLine( "Press to quit" ); + Console.ReadLine(); + } +} diff --git a/12_threading/async_5.cs b/12_threading/async_5.cs new file mode 100644 index 0000000..11f559a --- /dev/null +++ b/12_threading/async_5.cs @@ -0,0 +1,54 @@ +using System; +using System.Text; +using System.Threading; +using System.Net; +using System.Net.Sockets; + +public class EntryPoint { + private const int CONNECT_QUEUE_LENGTH = 4; + private const int LISTEN_PORT = 1234; + private const int MAX_CONNECTION_HANDLERS = 4; + + private static void HandleConnection( IAsyncResult ar ) { + Socket listener = (Socket) ar.AsyncState; + + Socket newConnection = listener.EndAccept( ar ); + byte[] msg = Encoding.UTF8.GetBytes( "Hello World!" ); + newConnection.BeginSend( msg, + 0, msg.Length, + SocketFlags.None, + new AsyncCallback( + EntryPoint.CloseConnection), + newConnection ); + + // Now queue another accept. + listener.BeginAccept( + new AsyncCallback(EntryPoint.HandleConnection), + listener ); + } + + static void CloseConnection( IAsyncResult ar ) { + Socket theSocket = (Socket) ar.AsyncState; + theSocket.Close(); + } + + static void Main() { + Socket listenSock = + new Socket( AddressFamily.InterNetwork, + SocketType.Stream, + ProtocolType.Tcp ); + listenSock.Bind( new IPEndPoint(IPAddress.Any, + LISTEN_PORT) ); + listenSock.Listen( CONNECT_QUEUE_LENGTH ); + + // Pend the connection handlers. + for( int i = 0; i < MAX_CONNECTION_HANDLERS; ++i ) { + listenSock.BeginAccept( + new AsyncCallback(EntryPoint.HandleConnection), + listenSock ); + } + + Console.WriteLine( "Press to quit" ); + Console.ReadLine(); + } +} diff --git a/12_threading/foreground_1.cs b/12_threading/foreground_1.cs new file mode 100644 index 0000000..ba1becc --- /dev/null +++ b/12_threading/foreground_1.cs @@ -0,0 +1,20 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + private static void ThreadFunc1() { + Thread.Sleep( 5000 ); + Console.WriteLine( "Exiting extra thread" ); + } + + static void Main() { + Thread thread1 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc1) ); + + thread1.Start(); + + Console.WriteLine( "Exiting main thread" ); + } +} + diff --git a/12_threading/interlocked_1.cs b/12_threading/interlocked_1.cs new file mode 100644 index 0000000..b273889 --- /dev/null +++ b/12_threading/interlocked_1.cs @@ -0,0 +1,53 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + static private int numberThreads = 0; + + static private Random rnd = new Random(); + + private static void RndThreadFunc() { + // Manage thread count and wait for a + // random amount of time between 1 and 12 + // seconds. + Interlocked.Increment( ref numberThreads ); + try { + int time = rnd.Next( 1000, 12000 ); + Thread.Sleep( time ); + } + finally { + Interlocked.Decrement( ref numberThreads ); + } + } + + private static void RptThreadFunc() { + while( true ) { + int threadCount = 0; + threadCount = + Interlocked.Exchange( ref numberThreads, + numberThreads ); + Console.WriteLine( "{0} thread(s) alive", + threadCount ); + Thread.Sleep( 1000 ); + } + } + + static void Main() { + // Start the reporting threads. + Thread reporter = + new Thread( new ThreadStart( + EntryPoint.RptThreadFunc) ); + reporter.IsBackground = true; + reporter.Start(); + + // Start the threads that wait random time. + Thread[] rndthreads = new Thread[ 50 ]; + for( uint i = 0; i < 50; ++i ) { + rndthreads[i] = + new Thread( new ThreadStart( + EntryPoint.RndThreadFunc) ); + rndthreads[i].Start(); + } + } +} diff --git a/12_threading/interlocked_2.cs b/12_threading/interlocked_2.cs new file mode 100644 index 0000000..f27f9c5 --- /dev/null +++ b/12_threading/interlocked_2.cs @@ -0,0 +1,79 @@ +using System; +using System.IO; +using System.Threading; + +public class SpinLock +{ + public SpinLock( int spinWait ) { + this.spinWait = spinWait; + } + + public void Enter() { + while( Interlocked.CompareExchange(ref theLock, + 1, + 0) == 1 ) { + // The lock is taken, spin. + Thread.Sleep( spinWait ); + } + } + + public void Exit() { + // Reset the lock. + Interlocked.Exchange( ref theLock, + 0 ); + } + + private int theLock = 0; + private int spinWait; +} + +public class SpinLockManager : IDisposable +{ + public SpinLockManager( SpinLock spinLock ) { + this.spinLock = spinLock; + spinLock.Enter(); + } + + public void Dispose() { + spinLock.Exit(); + } + + private SpinLock spinLock; +} + +public class EntryPoint +{ + static private Random rnd = new Random(); + private static SpinLock logLock = new SpinLock( 10 ); + private static StreamWriter fsLog = + new StreamWriter( File.Open("log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None) ); + + private static void RndThreadFunc() { + using( new SpinLockManager(logLock) ) { + fsLog.WriteLine( "Thread Starting" ); + fsLog.Flush(); + } + + int time = rnd.Next( 10, 200 ); + Thread.Sleep( time ); + + using( new SpinLockManager(logLock) ) { + fsLog.WriteLine( "Thread Exiting" ); + fsLog.Flush(); + } + } + + static void Main() { + // Start the threads that wait random time. + Thread[] rndthreads = new Thread[ 50 ]; + for( uint i = 0; i < 50; ++i ) { + rndthreads[i] = + new Thread( new ThreadStart( + EntryPoint.RndThreadFunc) ); + rndthreads[i].Start(); + } + } +} diff --git a/12_threading/monitor_1.cs b/12_threading/monitor_1.cs new file mode 100644 index 0000000..41dad18 --- /dev/null +++ b/12_threading/monitor_1.cs @@ -0,0 +1,68 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + static private object theLock = new Object(); + static private int numberThreads = 0; + static private Random rnd = new Random(); + + private static void RndThreadFunc() { + // Manage thread count and wait for a + // random amount of time between 1 and 12 + // seconds. + try { + Monitor.Enter( theLock ); + ++numberThreads; + } + finally { + Monitor.Exit( theLock ); + } + + int time = rnd.Next( 1000, 12000 ); + Thread.Sleep( time ); + + try { + Monitor.Enter( theLock ); + --numberThreads; + } + finally { + Monitor.Exit( theLock ); + } + } + + private static void RptThreadFunc() { + while( true ) { + int threadCount = 0; + try { + Monitor.Enter( theLock ); + threadCount = numberThreads; + } + finally { + Monitor.Exit( theLock ); + } + + Console.WriteLine( "{0} thread(s) alive", + threadCount ); + Thread.Sleep( 1000 ); + } + } + + static void Main() { + // Start the reporting threads. + Thread reporter = + new Thread( new ThreadStart( + EntryPoint.RptThreadFunc) ); + reporter.IsBackground = true; + reporter.Start(); + + // Start the threads that wait random time. + Thread[] rndthreads = new Thread[ 50 ]; + for( uint i = 0; i < 50; ++i ) { + rndthreads[i] = + new Thread( new ThreadStart( + EntryPoint.RndThreadFunc) ); + rndthreads[i].Start(); + } + } +} diff --git a/12_threading/monitor_2.cs b/12_threading/monitor_2.cs new file mode 100644 index 0000000..f103d7b --- /dev/null +++ b/12_threading/monitor_2.cs @@ -0,0 +1,56 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + static private object theLock = new Object(); + static private int numberThreads = 0; + static private Random rnd = new Random(); + + private static void RndThreadFunc() { + // Manage thread count and wait for a + // random amount of time between 1 and 12 + // seconds. + lock( theLock ) { + ++numberThreads; + } + + int time = rnd.Next( 1000, 12000 ); + Thread.Sleep( time ); + + lock( theLock ) { + --numberThreads; + } + } + + private static void RptThreadFunc() { + while( true ) { + int threadCount = 0; + lock( theLock ) { + threadCount = numberThreads; + } + + Console.WriteLine( "{0} thread(s) alive", + threadCount ); + Thread.Sleep( 1000 ); + } + } + + static void Main() { + // Start the reporting threads. + Thread reporter = + new Thread( new ThreadStart( + EntryPoint.RptThreadFunc) ); + reporter.IsBackground = true; + reporter.Start(); + + // Start the threads that wait random time. + Thread[] rndthreads = new Thread[ 50 ]; + for( uint i = 0; i < 50; ++i ) { + rndthreads[i] = + new Thread( new ThreadStart( + EntryPoint.RndThreadFunc) ); + rndthreads[i].Start(); + } + } +} diff --git a/12_threading/monitor_3.cs b/12_threading/monitor_3.cs new file mode 100644 index 0000000..9d6592f --- /dev/null +++ b/12_threading/monitor_3.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + static private int counter = 0; + + // NEVER DO THIS !!! + static private int theLock = 0; + + static private void ThreadFunc() { + for( int i = 0; i < 50; ++i ) { + Monitor.Enter( theLock ); + try { + Console.WriteLine( ++counter ); + } + finally { + Monitor.Exit( theLock ); + } + } + } + + static void Main() { + Thread thread1 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + Thread thread2 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + thread1.Start(); + thread2.Start(); + } +} diff --git a/12_threading/monitor_4.cs b/12_threading/monitor_4.cs new file mode 100644 index 0000000..bd4a4e1 --- /dev/null +++ b/12_threading/monitor_4.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + static private int counter = 0; + + static private object theLock = new Object(); + + static private void ThreadFunc1() { + lock( theLock ) { + for( int i = 0; i < 50; ++i ) { + Monitor.Wait( theLock, Timeout.Infinite ); + Console.WriteLine( "{0} from Thread {1}", + ++counter, + Thread.CurrentThread.GetHashCode() ); + Monitor.Pulse( theLock ); + } + } + } + + static private void ThreadFunc2() { + lock( theLock ) { + for( int i = 0; i < 50; ++i ) { + Monitor.Pulse( theLock ); + Monitor.Wait( theLock, Timeout.Infinite ); + Console.WriteLine( "{0} from Thread {1}", + ++counter, + Thread.CurrentThread.GetHashCode() ); + } + } + } + + static void Main() { + Thread thread1 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc1) ); + Thread thread2 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc2) ); + thread1.Start(); + thread2.Start(); + } +} diff --git a/12_threading/monitor_5.cs b/12_threading/monitor_5.cs new file mode 100644 index 0000000..94816cf --- /dev/null +++ b/12_threading/monitor_5.cs @@ -0,0 +1,84 @@ +using System; +using System.Threading; +using System.Collections; + +public class CrudeThreadPool +{ + static readonly int MAX_WORK_THREADS = 4; + static readonly int WAIT_TIMEOUT = 2000; + + public delegate void WorkDelegate(); + + public CrudeThreadPool() { + stop = 0; + workLock = new Object(); + workQueue = new Queue(); + threads = new Thread[ MAX_WORK_THREADS ]; + + for( int i = 0; i < MAX_WORK_THREADS; ++i ) { + threads[i] = + new Thread( new ThreadStart(this.ThreadFunc) ); + threads[i].Start(); + } + } + + private void ThreadFunc() { + lock( workLock ) { + int shouldStop = 0; + do { + shouldStop = Interlocked.Exchange( ref stop, + stop ); + if( shouldStop == 0 ) { + WorkDelegate workItem = null; + if( Monitor.Wait(workLock, WAIT_TIMEOUT) ) { + // Process the item on the front of the + // queue + lock( workQueue ) { + workItem = + (WorkDelegate) workQueue.Dequeue(); + } + workItem(); + } + } + } while( shouldStop == 0 ); + } + } + + public void SubmitWorkItem( WorkDelegate item ) { + lock( workLock ) { + lock( workQueue ) { + workQueue.Enqueue( item ); + } + + Monitor.Pulse( workLock ); + } + } + + public void Shutdown() { + Interlocked.Exchange( ref stop, 1 ); + } + + private Queue workQueue; + private Object workLock; + private Thread[] threads; + private int stop; +} + +public class EntryPoint +{ + static void WorkFunction() { + Console.WriteLine( "WorkFunction() called on Thread {0}", + Thread.CurrentThread.GetHashCode() ); + } + + static void Main() { + CrudeThreadPool pool = new CrudeThreadPool(); + for( int i = 0; i < 10; ++i ) { + pool.SubmitWorkItem( + new CrudeThreadPool.WorkDelegate( + EntryPoint.WorkFunction) ); + } + + pool.Shutdown(); + } +} diff --git a/12_threading/named_event_1.cs b/12_threading/named_event_1.cs new file mode 100644 index 0000000..02fa28d --- /dev/null +++ b/12_threading/named_event_1.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading; +using System.Runtime.InteropServices; +using System.ComponentModel; +using Microsoft.Win32.SafeHandles; + +public class NamedEventCreator +{ + [DllImport( "KERNEL32.DLL", EntryPoint="CreateEventW", + SetLastError=true )] + private static extern SafeWaitHandle CreateEvent( + IntPtr lpEventAttributes, + bool bManualReset, + bool bInitialState, + string lpName ); + + public const int INVALID_HANDLE_VALUE = -1; + + public static AutoResetEvent CreateAutoResetEvent( + bool initialState, + string name ) { + // Create named event. + SafeWaitHandle rawEvent = CreateEvent( IntPtr.Zero, + false, + false, + name ); + if( rawEvent.IsInvalid ) { + throw new Win32Exception( + Marshal.GetLastWin32Error() ); + } + + // Create a managed event type based on this handle. + AutoResetEvent autoEvent = new AutoResetEvent( false ); + + // Must clean up handle currently in autoEvent + // before swapping it with the named one. + autoEvent.SafeWaitHandle = rawEvent; + + return autoEvent; + } +} + diff --git a/12_threading/thread_1.cs b/12_threading/thread_1.cs new file mode 100644 index 0000000..fa9f646 --- /dev/null +++ b/12_threading/thread_1.cs @@ -0,0 +1,28 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + private static void ThreadFunc() { + Console.WriteLine( "Hello from new thread {0}!", + Thread.CurrentThread.GetHashCode() ); + } + + static void Main() { + // Create the new thread. + Thread newThread = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + + Console.WriteLine( "Main Thread is {0}", + Thread.CurrentThread.GetHashCode() ); + Console.WriteLine( "Starting new thread..." ); + + // Start the new thread. + newThread.Start(); + + // Wait for new thread to finish. + newThread.Join(); + + Console.WriteLine( "New thread has finished" ); + } +} diff --git a/12_threading/thread_2.cs b/12_threading/thread_2.cs new file mode 100644 index 0000000..e5aa945 --- /dev/null +++ b/12_threading/thread_2.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading; +using System.Collections; + +public class QueueProcessor +{ + public QueueProcessor( Queue theQueue ) { + this.theQueue = theQueue; + theThread = new Thread( new ThreadStart(this.ThreadFunc) ); + } + + private Queue theQueue; + + private Thread theThread; + public Thread TheThread { + get { + return theThread; + } + } + + public void BeginProcessData() { + theThread.Start(); + } + + public void EndProcessData() { + theThread.Join(); + } + + private void ThreadFunc() { + // ... drain theQueue here. + } +} + +public class EntryPoint +{ + static void Main() { + Queue queue1 = new Queue(); + Queue queue2 = new Queue(); + + // ... operations to fill the queues with data. + + // Process each queue in a separate threda. + QueueProcessor proc1 = new QueueProcessor( queue1 ); + proc1.BeginProcessData(); + + QueueProcessor proc2 = new QueueProcessor( queue2 ); + proc2.BeginProcessData(); + + // ... do some other work in the meantime. + + // Wait for the work to finish. + proc1.EndProcessData(); + proc2.EndProcessData(); + } +} diff --git a/12_threading/thread_abort_1.cs b/12_threading/thread_abort_1.cs new file mode 100644 index 0000000..f7422d2 --- /dev/null +++ b/12_threading/thread_abort_1.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + private static void ThreadFunc() { + ulong counter = 0; + while( true ) { + try { + Console.WriteLine( "{0}", counter++ ); + } + catch( ThreadAbortException ) { + // Attempt to swallow the exception and continue. + Console.WriteLine( "Abort!" ); + } + } + } + + static void Main() { + Thread newThread = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + newThread.Start(); + Thread.Sleep( 2000 ); + + // Abort the thread. + newThread.Abort(); + + // Wait for thread to finish. + newThread.Join(); + } +} diff --git a/12_threading/timer_1.cs b/12_threading/timer_1.cs new file mode 100644 index 0000000..a86e6dd --- /dev/null +++ b/12_threading/timer_1.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading; + +public class EntryPoint +{ + private static void TimerProc( object state ) { + Console.WriteLine( "The current time is {0} on thread {1}", + DateTime.Now, + Thread.CurrentThread.GetHashCode() ); + Thread.Sleep( 3000 ); + } + + static void Main() { + Console.WriteLine( "Press when finished\n\n" ); + + Timer myTimer = + new Timer( new TimerCallback(EntryPoint.TimerProc), + null, + 0, + 2000 ); + + Console.ReadLine(); + myTimer.Dispose(); + } +} diff --git a/12_threading/tls2.cs b/12_threading/tls2.cs new file mode 100644 index 0000000..92c5f16 --- /dev/null +++ b/12_threading/tls2.cs @@ -0,0 +1,48 @@ +using System; +using System.Threading; + +public class TLSClass +{ + static TLSClass() { + tlsSlot = Thread.AllocateDataSlot(); + } + + public TLSClass() { + Console.WriteLine( "Creating TLSClass" ); + } + + public static TLSClass TlsSlot { + get { + Object obj = Thread.GetData( tlsSlot ); + if( obj == null ) { + obj = new TLSClass(); + Thread.SetData( tlsSlot, obj ); + } + return (TLSClass) obj; + } + } + + private static LocalDataStoreSlot tlsSlot = null; +} + +public class EntryPoint +{ + private static void ThreadFunc() { + Console.WriteLine( "Thread {0} starting...", + Thread.CurrentThread.GetHashCode() ); + Console.WriteLine( "tlsdata for this thread is \"{0}\"", + TLSClass.TlsSlot ); + Console.WriteLine( "Thread {0} exiting", + Thread.CurrentThread.GetHashCode() ); + } + + static void Main() { + Thread thread1 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + Thread thread2 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + + thread1.Start(); + thread2.Start(); + } +} diff --git a/12_threading/tls_1.cs b/12_threading/tls_1.cs new file mode 100644 index 0000000..d1408e7 --- /dev/null +++ b/12_threading/tls_1.cs @@ -0,0 +1,37 @@ +using System; +using System.Threading; + +public class TLSClass +{ + public TLSClass() { + Console.WriteLine( "Creating TLSClass" ); + } +} + +public class TLSFieldClass +{ + [ThreadStatic] + public static TLSClass tlsdata = new TLSClass(); +} + +public class EntryPoint +{ + private static void ThreadFunc() { + Console.WriteLine( "Thread {0} starting...", + Thread.CurrentThread.GetHashCode() ); + Console.WriteLine( "tlsdata for this thread is \"{0}\"", + TLSFieldClass.tlsdata ); + Console.WriteLine( "Thread {0} exiting", + Thread.CurrentThread.GetHashCode() ); + } + + static void Main() { + Thread thread1 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + Thread thread2 = + new Thread( new ThreadStart(EntryPoint.ThreadFunc) ); + + thread1.Start(); + thread2.Start(); + } +} diff --git a/13_canonical_forms/13_clone_1.cs b/13_canonical_forms/13_clone_1.cs new file mode 100644 index 0000000..b688bfc --- /dev/null +++ b/13_canonical_forms/13_clone_1.cs @@ -0,0 +1,17 @@ +using System; + +public sealed class Dimensions : ICloneable +{ + public Dimensions( long width, long height ) { + this.width = width; + this.height = height; + } + + // IClonable implementation + public object Clone() { + return this.MemberwiseClone(); + } + + private long width; + private long height; +} diff --git a/13_canonical_forms/13_clone_2.cs b/13_canonical_forms/13_clone_2.cs new file mode 100644 index 0000000..ea0f138 --- /dev/null +++ b/13_canonical_forms/13_clone_2.cs @@ -0,0 +1,27 @@ +using System; + +public sealed class Dimensions : ICloneable +{ + public Dimensions( long width, long height ) { + Console.WriteLine( "Dimensions( long, long) called" ); + + this.width = width; + this.height = height; + } + + // Private copy constructor used when making a copy of this object. + private Dimensions( Dimensions other ) { + Console.WriteLine( "Dimensions( Dimensions ) called" ); + + this.width = other.width; + this.height = other.height; + } + + // IClonable implementation + public object Clone() { + return new Dimensions(this); + } + + private long width; + private long height; +} diff --git a/13_canonical_forms/13_clone_3.cs b/13_canonical_forms/13_clone_3.cs new file mode 100644 index 0000000..a0082f3 --- /dev/null +++ b/13_canonical_forms/13_clone_3.cs @@ -0,0 +1,63 @@ +using System; + +// Title class +// +public sealed class Title : ICloneable +{ + public enum TitleNameEnum { + GreenHorn, + HotshotGuru + } + + public Title( TitleNameEnum title ) { + this.title = title; + + LookupPayScale(); + } + + private Title( Title other ) { + this.title = other.title; + + LookupPayScale(); + } + + // IClonable implementation + public object Clone() { + return new Title(this); + } + + private void LookupPayScale() { + // Looks up the pay scale in a database. Payscale is + // based upon the title. + } + + private TitleNameEnum title; + private double minPay; + private double maxPay; +} + +// Employee class +// +public sealed class Employee : ICloneable +{ + public Employee( string name, Title title, string ssn ) { + this.name = name; + this.title = title; + this.ssn = ssn; + } + + private Employee( Employee other ) { + this.name = String.Copy( other.name ); + this.title = (Title) other.title.Clone(); + this.ssn = String.Copy( other.ssn ); + } + + // ICloneable implementation + public object Clone() { + return new Employee(this); + } + + private string name; + private Title title; + private string ssn; +} diff --git a/13_canonical_forms/13_clone_4.cs b/13_canonical_forms/13_clone_4.cs new file mode 100644 index 0000000..e69ab6c --- /dev/null +++ b/13_canonical_forms/13_clone_4.cs @@ -0,0 +1,19 @@ +using System; +using CloneHelpers; + +public sealed class Dimensions : ICloneable +{ + public Dimensions( long width, long height ) { + this.width = width; + this.height = height; + } + + // IClonable implementation + [CloneStyleAttribute(CloneStyle.Deep)] + public object Clone() { + return this.MemberwiseClone(); + } + + private long width; + private long height; +} diff --git a/13_canonical_forms/13_clone_attribute.cs b/13_canonical_forms/13_clone_attribute.cs new file mode 100644 index 0000000..64bf03f --- /dev/null +++ b/13_canonical_forms/13_clone_attribute.cs @@ -0,0 +1,27 @@ +using System; + +namespace CloneHelpers +{ + +public enum CloneStyle { + Deep, + Shallow +} + +[AttributeUsageAttribute(AttributeTargets.Method)] +public sealed class CloneStyleAttribute : Attribute +{ + public CloneStyleAttribute( CloneStyle clonestyle ) { + this.clonestyle = clonestyle; + } + + public CloneStyle Style { + get { + return clonestyle; + } + } + + private CloneStyle clonestyle; +} + +} diff --git a/13_canonical_forms/13_comparable_1.cs b/13_canonical_forms/13_comparable_1.cs new file mode 100644 index 0000000..42a058a --- /dev/null +++ b/13_canonical_forms/13_comparable_1.cs @@ -0,0 +1,66 @@ +using System; + +public sealed class ComplexNumber : IComparable +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public override bool Equals( object other ) { + bool result = false; + ComplexNumber that = other as ComplexNumber; + if( that != null ) { + result = InternalEquals( that ); + } + + return result; + } + + public override int GetHashCode() { + return (int) this.Magnitude; + } + + public static bool operator ==( ComplexNumber num1, ComplexNumber num2 ) { + return Object.Equals(num1, num2); + } + + public static bool operator !=( ComplexNumber num1, ComplexNumber num2 ) { + return !Object.Equals(num1, num2); + } + + public int CompareTo( object other ) { + ComplexNumber that = other as ComplexNumber; + if( that == null ) { + throw new ArgumentException( "Bad Comparison!" ); + } + + int result; + if( InternalEquals(that) ) { + result = 0; + } else if( this.Magnitude > that.Magnitude ) { + result = 1; + } else { + result = -1; + } + + return result; + } + + private bool InternalEquals( ComplexNumber that ) { + return (this.real == that.real) && + (this.imaginary == that.imaginary); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} diff --git a/13_canonical_forms/13_const_correct_1.cs b/13_canonical_forms/13_const_correct_1.cs new file mode 100644 index 0000000..0fdff93 --- /dev/null +++ b/13_canonical_forms/13_const_correct_1.cs @@ -0,0 +1,72 @@ +using System; + +public sealed class ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public double Real { + get { + return real; + } + + set { + real = value; + } + } + + public double Imaginary { + get { + return imaginary; + } + + set { + imaginary = value; + } + } + + // Other methods removed for clarity + + private double real; + private double imaginary; +} + +public sealed class ConstComplexNumber +{ + public ConstComplexNumber( ComplexNumber pimpl ) { + this.pimpl = pimpl; + } + + public double Real { + get { + return pimpl.Real; + } + } + + public double Imaginary { + get { + return pimpl.Imaginary; + } + } + + private readonly ComplexNumber pimpl; +} + +public sealed class EntryPoint +{ + static void Main() { + ComplexNumber someNumber = new ComplexNumber( 1, 2 ); + SomeMethod( new ConstComplexNumber(someNumber) ); + + // We are guaranteed by the contract of ConstComplexNumber that + // someNumber has not been changed at this point. + } + + static void SomeMethod( ConstComplexNumber number ) { + Console.WriteLine( "( {0}, {1} )", + number.Real, + number.Imaginary ); + } +} diff --git a/13_canonical_forms/13_convertible_1.cs b/13_canonical_forms/13_convertible_1.cs new file mode 100644 index 0000000..5a38c44 --- /dev/null +++ b/13_canonical_forms/13_convertible_1.cs @@ -0,0 +1,24 @@ +using System; + +public sealed class ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} + +public sealed class EntryPoint +{ + static void Main() { + ComplexNumber num1 = new ComplexNumber( 1.12345678, 2.12345678 ); + + string str = + (string) Convert.ChangeType( num1, typeof(string) ); + } +} diff --git a/13_canonical_forms/13_dispose_1.cs b/13_canonical_forms/13_dispose_1.cs new file mode 100644 index 0000000..6ad862f --- /dev/null +++ b/13_canonical_forms/13_dispose_1.cs @@ -0,0 +1,17 @@ +using System; +using System.IO; + +public sealed class WriteStuff +{ + static void Main(){ + StreamWriter sw = new StreamWriter("Output.txt"); + try { + sw.WriteLine( "This is a test of the emergency dispose mechanism" ); + } + finally { + if( sw != null ) { + ((IDisposable)sw).Dispose(); + } + } + } +} diff --git a/13_canonical_forms/13_dispose_2.cs b/13_canonical_forms/13_dispose_2.cs new file mode 100644 index 0000000..abadd8b --- /dev/null +++ b/13_canonical_forms/13_dispose_2.cs @@ -0,0 +1,11 @@ +using System; +using System.IO; + +public sealed class WriteStuff +{ + static void Main(){ + using( StreamWriter sw = new StreamWriter("Output.txt") ) { + sw.WriteLine( "This is a test of the emergency dispose mechanism" ); + } + } +} diff --git a/13_canonical_forms/13_dispose_3.cs b/13_canonical_forms/13_dispose_3.cs new file mode 100644 index 0000000..6d68a6e --- /dev/null +++ b/13_canonical_forms/13_dispose_3.cs @@ -0,0 +1,28 @@ +using System; +using System.Runtime.InteropServices; + +public sealed class Win32Heap : IDisposable +{ + [DllImport("kernel32.dll")] + static extern IntPtr HeapCreate(uint flOptions, UIntPtr dwInitialSize, + UIntPtr dwMaximumSize); + + [DllImport("kernel32.dll")] + static extern bool HeapDestroy(IntPtr hHeap); + + public Win32Heap() { + theHeap = HeapCreate( 0, (UIntPtr) 4096, UIntPtr.Zero ); + } + + // IDisposable implementation + public void Dispose() { + if( !disposed ) { + HeapDestroy( theHeap ); + theHeap = IntPtr.Zero; + disposed = true; + } + } + + private IntPtr theHeap; + private bool disposed = false; +} diff --git a/13_canonical_forms/13_finalize_1.cs b/13_canonical_forms/13_finalize_1.cs new file mode 100644 index 0000000..3f6b939 --- /dev/null +++ b/13_canonical_forms/13_finalize_1.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; + +public class Win32Heap : IDisposable +{ + [DllImport("kernel32.dll")] + static extern IntPtr HeapCreate(uint flOptions, UIntPtr dwInitialSize, + UIntPtr dwMaximumSize); + + [DllImport("kernel32.dll")] + static extern bool HeapDestroy(IntPtr hHeap); + + public Win32Heap() { + theHeap = HeapCreate( 0, (UIntPtr) 4096, UIntPtr.Zero ); + } + + // IDisposable implementation + protected virtual void Dispose( bool disposing ) { + if( !disposed ) { + if( disposing ) { + // It's ok to use any internal objects here. This class happens + // to not have any though. + } + + // If using objects that you know do still exist, such as objects + // that implement the singleton pattern, it is important to make + // sure those objects are thread safe. + + HeapDestroy( theHeap ); + theHeap = IntPtr.Zero; + disposed = true; + } + } + + public void Dispose() { + Dispose( true ); + GC.SuppressFinalize( this ); + } + + ~Win32Heap() { + Dispose( false ); + } + + private IntPtr theHeap; + private bool disposed = false; +} diff --git a/13_canonical_forms/13_finalize_2.cs b/13_canonical_forms/13_finalize_2.cs new file mode 100644 index 0000000..9d3c3c8 --- /dev/null +++ b/13_canonical_forms/13_finalize_2.cs @@ -0,0 +1,82 @@ +using System; +using System.Runtime.InteropServices; +using System.Diagnostics; + +public sealed class Win32Heap : IDisposable +{ + [DllImport("kernel32.dll")] + static extern IntPtr HeapCreate(uint flOptions, + UIntPtr dwInitialSize, + UIntPtr dwMaximumSize); + + [DllImport("kernel32.dll")] + static extern bool HeapDestroy(IntPtr hHeap); + + public Win32Heap() { + creationStackTrace = new StackTrace(1, true); + + theHeap = HeapCreate( 0, (UIntPtr) 4096, UIntPtr.Zero ); + } + + // IDisposable implementation + private void Dispose( bool disposing ) { + if( !disposed ) { + if( disposing ) { + // It's ok to use any internal objects here. This + // class happens to not have any though. + } else { + // OOPS! We're finalizing this object and it has not + // been disposed. Let's let the user know about it if + // the app domain is not shutting down. + AppDomain currentDomain = AppDomain.CurrentDomain; + if( !currentDomain.IsFinalizingForUnload() && + !Environment.HasShutdownStarted ) { + Console.WriteLine( + "Failed to dispose of object!!!" ); + Console.WriteLine( "Object allocated at:" ); + for( int i = 0; + i < creationStackTrace.FrameCount; + ++i ) { + StackFrame frame = + creationStackTrace.GetFrame(i); + Console.WriteLine( " {0}", + frame.ToString() ); + } + } + } + + // If using objects that you know do still exist, such + // as objects that implement the singleton pattern, it + // is important to make sure those objects are thread + // safe. + + HeapDestroy( theHeap ); + theHeap = IntPtr.Zero; + disposed = true; + } + } + + public void Dispose() { + Dispose( true ); + GC.SuppressFinalize( this ); + } + + ~Win32Heap() { + Dispose( false ); + } + + private IntPtr theHeap; + private bool disposed = false; + private StackTrace creationStackTrace; +} + +public sealed class EntryPoint +{ + static void Main() + { + Win32Heap heap = new Win32Heap(); + heap = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + } +} diff --git a/13_canonical_forms/13_formattable_1.cs b/13_canonical_forms/13_formattable_1.cs new file mode 100644 index 0000000..d876bc9 --- /dev/null +++ b/13_canonical_forms/13_formattable_1.cs @@ -0,0 +1,47 @@ +using System; +using System.Globalization; + +public sealed class ComplexNumber : IFormattable +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public override string ToString() { + return ToString( "G", null ); + } + + // IFormattable implementation + public string ToString( string format, + IFormatProvider formatProvider ) { + string result = "(" + + real.ToString(format, formatProvider) + + " " + + real.ToString(format, formatProvider) + + ")"; + return result; + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} + +public sealed class EntryPoint +{ + static void Main() { + ComplexNumber num1 = new ComplexNumber( 1.12345678, + 2.12345678 ); + + Console.WriteLine( "US format: {0}", + num1.ToString( "F5", + new CultureInfo("en-US") ) ); + Console.WriteLine( "DE format: {0}", + num1.ToString( "F5", + new CultureInfo("de-DE") ) ); + Console.WriteLine( "Object.ToString(): {0}", + num1.ToString() ); + } +} diff --git a/13_canonical_forms/13_gethashcode_1.cs b/13_canonical_forms/13_gethashcode_1.cs new file mode 100644 index 0000000..28cee92 --- /dev/null +++ b/13_canonical_forms/13_gethashcode_1.cs @@ -0,0 +1,38 @@ +using System; + +public sealed class ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public override bool Equals( object other ) { + bool result = false; + ComplexNumber that = other as ComplexNumber; + if( that != null ) { + result = (this.real == that.real) && + (this.imaginary == that.imaginary); + } + + return result; + } + + public override int GetHashCode() { + return (int) Math.Sqrt( Math.Pow(this.real, 2) * + Math.Pow(this.imaginary, 2) ); + } + + public static bool operator ==( ComplexNumber num1, ComplexNumber num2 ) { + return Object.Equals(num1, num2); + } + + public static bool operator !=( ComplexNumber num1, ComplexNumber num2 ) { + return !Object.Equals(num1, num2); + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} diff --git a/13_canonical_forms/13_nvi_1.cs b/13_canonical_forms/13_nvi_1.cs new file mode 100644 index 0000000..00148ef --- /dev/null +++ b/13_canonical_forms/13_nvi_1.cs @@ -0,0 +1,23 @@ +using System; + +public class Base +{ + public virtual void DoWork() { + Console.WriteLine( "Base.DoWork()" ); + } +} + +public class Derived : Base +{ + public override void DoWork() { + Console.WriteLine( "Derived.DoWork()" ); + } +} + +public class EntryPoint +{ + static void Main() { + Base b = new Derived(); + b.DoWork(); + } +} diff --git a/13_canonical_forms/13_nvi_2.cs b/13_canonical_forms/13_nvi_2.cs new file mode 100644 index 0000000..0e6834a --- /dev/null +++ b/13_canonical_forms/13_nvi_2.cs @@ -0,0 +1,27 @@ +using System; + +public class Base +{ + public void DoWork() { + CoreDoWork(); + } + + protected virtual void CoreDoWork() { + Console.WriteLine( "Base.DoWork()" ); + } +} + +public class Derived : Base +{ + protected override void CoreDoWork() { + Console.WriteLine( "Derived.DoWork()" ); + } +} + +public class EntryPoint +{ + static void Main() { + Base b = new Derived(); + b.DoWork(); + } +} diff --git a/13_canonical_forms/13_nvi_3.cs b/13_canonical_forms/13_nvi_3.cs new file mode 100644 index 0000000..80f8e48 --- /dev/null +++ b/13_canonical_forms/13_nvi_3.cs @@ -0,0 +1,30 @@ +// WILL NOT COMPILE!!!!! +using System; + +public class Base +{ + public void DoWork() { + CoreDoWork(); + } + + // WILL NOT COMPILE!!!!! + private virtual void CoreDoWork() { + Console.WriteLine( "Base.DoWork()" ); + } +} + +public class Derived : Base +{ + // WILL NOT COMPILE!!!!! + private override void CoreDoWork() { + Console.WriteLine( "Derived.DoWork()" ); + } +} + +public class EntryPoint +{ + static void Main() { + Base b = new Derived(); + b.DoWork(); + } +} diff --git a/13_canonical_forms/13_operators_1.cs b/13_canonical_forms/13_operators_1.cs new file mode 100644 index 0000000..83e4e13 --- /dev/null +++ b/13_canonical_forms/13_operators_1.cs @@ -0,0 +1,37 @@ +sealed public class Point +{ + // other methods removed for clarity + + public override bool Equals( object other ) { + bool result = false; + Point that = other as Point; + if( that != null ) { + result = (this.coordinates == that.coordinates); + } + + return result; + } + + public override int GetHashCode() { + return precomputedHash; + } + + public static bool operator ==( Point pt1, Point pt2 ) { + if( pt1.GetHashCode() != pt2.GetHashCode() ) { + return false; + } else { + return Object.Equals( pt1, pt2 ); + } + } + + public static bool operator !=( Point pt1, Point pt2 ) { + if( pt1.GetHashCode() != pt2.GetHashCode() ) { + return true; + } else { + return !Object.Equals( pt1, pt2 ); + } + } + + private float[] coordinates; + private int precomputedHash; +} diff --git a/13_canonical_forms/13_string_oddity_1.cs b/13_canonical_forms/13_string_oddity_1.cs new file mode 100644 index 0000000..06ec34b --- /dev/null +++ b/13_canonical_forms/13_string_oddity_1.cs @@ -0,0 +1,22 @@ +using System; + +namespace string_test +{ + class Program + { + static void Main(string[] args) { + string strOriginal = "Original String"; + Console.WriteLine( "Value of strOriginal before call: {0}", + strOriginal ); + + TryToAlterString( strOriginal ); + + Console.WriteLine( "Value of strOriginal after call: {0}", + strOriginal ); + } + + static void TryToAlterString(string str) { + str = "Modified String"; + } + } +} diff --git a/13_canonical_forms/13_strong_types_1.cs b/13_canonical_forms/13_strong_types_1.cs new file mode 100644 index 0000000..a610776 --- /dev/null +++ b/13_canonical_forms/13_strong_types_1.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections; + +public class Employee +{ + public void Evaluate() { + Console.WriteLine( "Evaluating Employee..." ); + } +} + +public class WorkForceEnumerator : IEnumerator +{ + public WorkForceEnumerator( ArrayList employees ) { + this.enumerator = employees.GetEnumerator(); + } + + public Employee Current { + get { + return (Employee) enumerator.Current; + } + } + + object IEnumerator.Current { + get { + return enumerator.Current; + } + } + + public bool MoveNext() { + return enumerator.MoveNext(); + } + + public void Reset() { + enumerator.Reset(); + } + + private IEnumerator enumerator; +} + +public class WorkForce : IEnumerable +{ + public WorkForce() { + employees = new ArrayList(); + + // Let's put an employee in here for demo purposes. + employees.Add( new Employee() ); + } + + public WorkForceEnumerator GetEnumerator() { + return new WorkForceEnumerator( employees ); + } + + IEnumerator IEnumerable.GetEnumerator() { + return new WorkForceEnumerator( employees ); + } + + private ArrayList employees; +} + +public class EntryPoint +{ + static void Main() { + WorkForce staff = new WorkForce(); + foreach( Employee emp in staff ) { + emp.Evaluate(); + } + } +} diff --git a/13_canonical_forms/13_strong_types_2.cs b/13_canonical_forms/13_strong_types_2.cs new file mode 100644 index 0000000..f94a2ab --- /dev/null +++ b/13_canonical_forms/13_strong_types_2.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections; + +public class Employee +{ + public void Evaluate() { + Console.WriteLine( "Evaluating Employee..." ); + } +} + +public class WorkForceEnumerator : IEnumerator +{ + public WorkForceEnumerator( ArrayList employees ) { + this.enumerator = employees.GetEnumerator(); + } + + public object Current { + get { + return enumerator.Current; + } + } + + public bool MoveNext() { + return enumerator.MoveNext(); + } + + public void Reset() { + enumerator.Reset(); + } + + private IEnumerator enumerator; +} + +public class WorkForce : IEnumerable +{ + public WorkForce() { + employees = new ArrayList(); + + // Let's put an employee in here for demo purposes. + employees.Add( new Employee() ); + } + + public IEnumerator GetEnumerator() { + return new WorkForceEnumerator( employees ); + } + + private ArrayList employees; +} + +public class EntryPoint +{ + static void Main() { + WorkForce staff = new WorkForce(); + foreach( Employee emp in staff ) { + emp.Evaluate(); + } + } +} diff --git a/13_canonical_forms/13_typesafe_methods_1.cs b/13_canonical_forms/13_typesafe_methods_1.cs new file mode 100644 index 0000000..588d2b6 --- /dev/null +++ b/13_canonical_forms/13_typesafe_methods_1.cs @@ -0,0 +1,88 @@ +using System; + +public struct ComplexNumber : IComparable, + IComparable, + IEquatable +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public bool Equals( ComplexNumber other ) { + return (this.real == other.real) && + (this.imaginary == other.imaginary); + } + + public override bool Equals( object other ) { + bool result = false; + if( other is ComplexNumber ) { + ComplexNumber that = (ComplexNumber) other ; + + result = Equals( that ); + } + + return result; + } + + public override int GetHashCode() { + return (int) this.Magnitude; + } + + public static bool operator ==( ComplexNumber num1, + ComplexNumber num2 ) { + return num1.Equals(num2); + } + + public static bool operator !=( ComplexNumber num1, + ComplexNumber num2 ) { + return !num1.Equals(num2); + } + + public int CompareTo( ComplexNumber that ) { + int result; + if( Equals(that) ) { + result = 0; + } else if( this.Magnitude > that.Magnitude ) { + result = 1; + } else { + result = -1; + } + + return result; + } + + int IComparable.CompareTo( object other ) { + if( !(other is ComplexNumber) ) { + throw new ArgumentException( "Bad Comparison!" ); + } + + return CompareTo( (ComplexNumber) other ); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} + +public sealed class EntryPoint +{ + static void Main() + { + ComplexNumber num1 = new ComplexNumber( 1, 3 ); + ComplexNumber num2 = new ComplexNumber( 1, 2 ); + + int result = num1.CompareTo( num2 ); + + // Now, try the type-generic version + result = ((IComparable)num1).CompareTo( num2 ); + } +} diff --git a/13_canonical_forms/13_value_equals_1.cs b/13_canonical_forms/13_value_equals_1.cs new file mode 100644 index 0000000..efdc4b6 --- /dev/null +++ b/13_canonical_forms/13_value_equals_1.cs @@ -0,0 +1,81 @@ +using System; + +public struct ComplexNumber : IComparable +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public override bool Equals( object other ) { + bool result = false; + if( other is ComplexNumber ) { + ComplexNumber that = (ComplexNumber) other ; + + result = InternalEquals( that ); + } + + return result; + } + + public override int GetHashCode() { + return (int) this.Magnitude; + } + + public static bool operator ==( ComplexNumber num1, + ComplexNumber num2 ) { + return num1.Equals(num2); + } + + public static bool operator !=( ComplexNumber num1, + ComplexNumber num2 ) { + return !num1.Equals(num2); + } + + public int CompareTo( object other ) { + if( !(other is ComplexNumber) ) { + throw new ArgumentException( "Bad Comparison!" ); + } + + ComplexNumber that = (ComplexNumber) other; + + int result; + if( InternalEquals(that) ) { + result = 0; + } else if( this.Magnitude > that.Magnitude ) { + result = 1; + } else { + result = -1; + } + + return result; + } + + private bool InternalEquals( ComplexNumber that ) { + return (this.real == that.real) && + (this.imaginary == that.imaginary); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} + +public sealed class EntryPoint +{ + static void Main() + { + ComplexNumber num1 = new ComplexNumber( 1, 2 ); + ComplexNumber num2 = new ComplexNumber( 1, 2 ); + + bool result = num1.Equals( num2 ); + } +} diff --git a/13_canonical_forms/13_value_equals_2.cs b/13_canonical_forms/13_value_equals_2.cs new file mode 100644 index 0000000..83d01a0 --- /dev/null +++ b/13_canonical_forms/13_value_equals_2.cs @@ -0,0 +1,85 @@ +using System; + +public struct ComplexNumber : IComparable, + IComparable, + IEquatable +{ + public ComplexNumber( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public bool Equals( ComplexNumber other ) { + return (this.real == other.real) && + (this.imaginary == other.imaginary); + } + + public override bool Equals( object other ) { + bool result = false; + if( other is ComplexNumber ) { + ComplexNumber that = (ComplexNumber) other ; + + result = Equals( that ); + } + + return result; + } + + public override int GetHashCode() { + return (int) this.Magnitude; + } + + public static bool operator ==( ComplexNumber num1, + ComplexNumber num2 ) { + return num1.Equals(num2); + } + + public static bool operator !=( ComplexNumber num1, + ComplexNumber num2 ) { + return !num1.Equals(num2); + } + + public int CompareTo( object other ) { + if( !(other is ComplexNumber) ) { + throw new ArgumentException( "Bad Comparison!" ); + } + + return CompareTo( (ComplexNumber) other ); + } + + public int CompareTo( ComplexNumber that ) { + int result; + if( Equals(that) ) { + result = 0; + } else if( this.Magnitude > that.Magnitude ) { + result = 1; + } else { + result = -1; + } + + return result; + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + // Other methods removed for clarity + + private readonly double real; + private readonly double imaginary; +} + +public sealed class EntryPoint +{ + static void Main() + { + ComplexNumber num1 = new ComplexNumber( 1, 2 ); + ComplexNumber num2 = new ComplexNumber( 1, 2 ); + + bool result = num1.Equals( num2 ); + } +} diff --git a/13_canonical_forms/4_equality_1.cs b/13_canonical_forms/4_equality_1.cs new file mode 100644 index 0000000..67f54c7 --- /dev/null +++ b/13_canonical_forms/4_equality_1.cs @@ -0,0 +1,16 @@ +public class EntryPoint +{ + static bool TestForEquality( object obj1, object obj2 ) + { + return obj1.Equals( obj2 ); + } + + static void Main() + { + object obj1 = new System.Object(); + object obj2 = null; + + System.Console.WriteLine( "obj1 == obj2 is {0}", + TestForEquality(obj1, obj2) ); + } +} diff --git a/13_canonical_forms/4_equality_3.cs b/13_canonical_forms/4_equality_3.cs new file mode 100644 index 0000000..23a026c --- /dev/null +++ b/13_canonical_forms/4_equality_3.cs @@ -0,0 +1,27 @@ +public class EntryPoint +{ + static bool TestForEquality( object obj1, object obj2 ) + { + if( obj1 == null && obj2 == null ) { + return true; + } + + if( obj1 == null ) + { + return false; + } + + return obj1.Equals( obj2 ); + } + + static void Main() + { + object obj1 = new System.Object(); + object obj2 = null; + + System.Console.WriteLine( "obj1 == obj2 is {0}", + TestForEquality(obj2, obj1) ); + System.Console.WriteLine( "null == null is {0}", + TestForEquality(null, null) ); + } +} diff --git a/13_canonical_forms/4_ref_type_equals_1.cs b/13_canonical_forms/4_ref_type_equals_1.cs new file mode 100644 index 0000000..30481bd --- /dev/null +++ b/13_canonical_forms/4_ref_type_equals_1.cs @@ -0,0 +1,57 @@ +public class ComplexNumber +{ + public ComplexNumber( int real, int imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public override bool Equals( object obj ) + { + ComplexNumber other = obj as ComplexNumber; + + if( other == null ) + { + return false; + } + + return (this.real == other.real) && + (this.imaginary == other.imaginary); + } + + public override int GetHashCode() + { + return (int) real ^ (int) imaginary; + } + + public static bool operator==( ComplexNumber me, ComplexNumber other ) + { + return Equals( me, other ); + } + + public static bool operator!=( ComplexNumber me, ComplexNumber other ) + { + return Equals( me, other ); + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() + { + ComplexNumber referenceA = new ComplexNumber( 1, 2 ); + ComplexNumber referenceB = new ComplexNumber( 1, 2 ); + + System.Console.WriteLine( "Result of Equality is {0}", + referenceA == referenceB ); + + // If we really want referential equality. + System.Console.WriteLine( "Identity of references is {0}", + (object) referenceA == (object) referenceB ); + System.Console.WriteLine( "Identity of references is {0}", + ReferenceEquals(referenceA, referenceB) ); + } +} diff --git a/13_canonical_forms/4_references_1.cs b/13_canonical_forms/4_references_1.cs new file mode 100644 index 0000000..3f71145 --- /dev/null +++ b/13_canonical_forms/4_references_1.cs @@ -0,0 +1,8 @@ +public class EntryPoint +{ + static void Main() + { + object referenceA = new System.Object(); + object referenceB = referenceA; + } +} diff --git a/13_canonical_forms/4_references_2.cs b/13_canonical_forms/4_references_2.cs new file mode 100644 index 0000000..253292d --- /dev/null +++ b/13_canonical_forms/4_references_2.cs @@ -0,0 +1,23 @@ +public class ComplexNumber +{ + public ComplexNumber( int real, int imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + private int real; + private int imaginary; +} + +public class EntryPoint +{ + static void Main() + { + ComplexNumber referenceA = new ComplexNumber( 1, 2 ); + ComplexNumber referenceB = new ComplexNumber( 1, 2 ); + + System.Console.WriteLine( "Result of Equality is {0}", + referenceA == referenceB ); + } +} diff --git a/14_extension_methods/custom_iterator_1.cs b/14_extension_methods/custom_iterator_1.cs new file mode 100644 index 0000000..c54369e --- /dev/null +++ b/14_extension_methods/custom_iterator_1.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +public class IteratorExample +{ + static void Main() { + var matrix = new List> { + new List { 1, 2, 3 }, + new List { 4, 5, 6 }, + new List { 7, 8, 9 } + }; + + // One way of iterating the matrix. + foreach( var list in matrix ) { + foreach( var item in list ) { + Console.Write( "{0}, ", item ); + } + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_2.cs b/14_extension_methods/custom_iterator_2.cs new file mode 100644 index 0000000..4e919f2 --- /dev/null +++ b/14_extension_methods/custom_iterator_2.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +public static class CustomIterators +{ + public static IEnumerable GetRowMajorIterator( + this List> matrix ) { + foreach( var row in matrix ) { + foreach( var item in row ) { + yield return item; + } + } + } +} + +public class IteratorExample +{ + static void Main() { + var matrix = new List> { + new List { 1, 2, 3 }, + new List { 4, 5, 6 }, + new List { 7, 8, 9 } + }; + + // A more elegant way to enumerate the items. + foreach( var item in matrix.GetRowMajorIterator() ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_3.cs b/14_extension_methods/custom_iterator_3.cs new file mode 100644 index 0000000..3fcc742 --- /dev/null +++ b/14_extension_methods/custom_iterator_3.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + private MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class CustomIterators +{ + public static IEnumerable + LinkListIterator( this IList theList ) { + + for( var list = theList; + list.Tail != null; + list = list.Tail ) { + yield return list.Head; + } + } +} + +public class IteratorExample +{ + static void Main() { + var listInts = new List { 1, 2, 3, 4 }; + var linkList = + MyList.CreateList( listInts ); + + foreach( var item in linkList.LinkListIterator() ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_4.cs b/14_extension_methods/custom_iterator_4.cs new file mode 100644 index 0000000..2026cf4 --- /dev/null +++ b/14_extension_methods/custom_iterator_4.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + private MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class CustomIterators +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func, bool> finalState, + Func, IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } +} + +public class IteratorExample +{ + static void Main() { + var listInts = new List { 1, 2, 3, 4 }; + var linkList = + MyList.CreateList( listInts ); + + var iterator = linkList.GeneralIterator( delegate( IList list ) { + return list.Tail == null; + }, + delegate( IList list ) { + return list.Tail; + } ); + foreach( var item in iterator ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_5.cs b/14_extension_methods/custom_iterator_5.cs new file mode 100644 index 0000000..d086a2a --- /dev/null +++ b/14_extension_methods/custom_iterator_5.cs @@ -0,0 +1,96 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + private MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class CustomIterators +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func, bool> finalState, + Func, IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } + + public static IList Reverse( this IList theList ) { + var reverseList = new List(); + Func, List> reverseFunc = null; + + reverseFunc = delegate(IList list) { + if( list != null ) { + reverseFunc( list.Tail ); + if( list.Tail != null ) { + reverseList.Add( list.Head ); + } + } + return reverseList; + }; + + return MyList.CreateList( reverseFunc(theList) ); + } +} + +public class IteratorExample +{ + static void Main() { + var listInts = new List { 1, 2, 3, 4 }; + var linkList = + MyList.CreateList( listInts ); + + var iterator = linkList.Reverse().GeneralIterator( delegate( IList list ) { + return list.Tail == null; + }, + delegate( IList list ) { + return list.Tail; + } ); + foreach( var item in iterator ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_6.cs b/14_extension_methods/custom_iterator_6.cs new file mode 100644 index 0000000..2534ef2 --- /dev/null +++ b/14_extension_methods/custom_iterator_6.cs @@ -0,0 +1,95 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + public MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class CustomIterators +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func, bool> finalState, + Func, IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } + + public static IList Reverse( this IList theList ) { + var reverseList = new MyList(default(T), null); + Func, MyList> reverseFunc = null; + + reverseFunc = delegate(IList list) { + if( list.Tail != null ) { + reverseList = new MyList( list.Head, reverseList ); + reverseFunc( list.Tail ); + } + + return reverseList; + }; + + return reverseFunc(theList); + } +} + +public class IteratorExample +{ + static void Main() { + var listInts = new List { 1, 2, 3, 4 }; + var linkList = + MyList.CreateList( listInts ); + + var iterator = linkList.Reverse().GeneralIterator( delegate( IList list ) { + return list.Tail == null; + }, + delegate( IList list ) { + return list.Tail; + } ); + foreach( var item in iterator ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/custom_iterator_7.cs b/14_extension_methods/custom_iterator_7.cs new file mode 100644 index 0000000..28cca29 --- /dev/null +++ b/14_extension_methods/custom_iterator_7.cs @@ -0,0 +1,93 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + public MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class CustomIterators +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func, bool> finalState, + Func, IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } + + public static IList Reverse( this IList theList ) { + Func, IList, IList> reverseFunc = null; + + reverseFunc = delegate(IList list, IList result) { + if( list.Tail != null ) { + return reverseFunc( list.Tail, new MyList(list.Head, result) ); + } + + return result; + }; + + return reverseFunc(theList, new MyList(default(T), null)); + } +} + +public class IteratorExample +{ + static void Main() { + var listInts = new List { 1, 2, 3, 4 }; + var linkList = + MyList.CreateList( listInts ); + + var iterator = linkList.Reverse().GeneralIterator( delegate( IList list ) { + return list.Tail == null; + }, + delegate( IList list ) { + return list.Tail; + } ); + foreach( var item in iterator ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/14_extension_methods/ext_method_intro_1.cs b/14_extension_methods/ext_method_intro_1.cs new file mode 100644 index 0000000..3daf302 --- /dev/null +++ b/14_extension_methods/ext_method_intro_1.cs @@ -0,0 +1,26 @@ +using System; + +namespace ExtensionMethodDemo +{ + +public static class ExtensionMethods +{ + public static void SendToLog( this String str ) { + Console.WriteLine( str ); + } +} + +public class ExtensionMethodIntro +{ + static void Main() { + String str = "Some useful information to log"; + + // Call the extension method + str.SendToLog(); + + // Call the same method the old way. + ExtensionMethods.SendToLog( str ); + } +} + +} diff --git a/14_extension_methods/ext_method_lookup_1.cs b/14_extension_methods/ext_method_lookup_1.cs new file mode 100644 index 0000000..406d238 --- /dev/null +++ b/14_extension_methods/ext_method_lookup_1.cs @@ -0,0 +1,102 @@ +using System; + +public static class ExtensionMethods +{ + static public void WriteLine( this String str ) { + Console.WriteLine( "Default Namespace: " + str ); + } +} + +namespace A +{ + public static class ExtensionMethods + { + static public void WriteLine( this String str ) { + Console.WriteLine( "Namespace A: " + str ); + } + } +} + +namespace B +{ + public static class ExtensionMethods + { + static public void WriteLine( this String str ) { + Console.WriteLine( "Namespace B: " + str ); + } + } +} + +namespace C +{ + using A; + + public class Employee + { + public Employee( String name ) { + this.name = name; + } + + public void PrintName() { + name.WriteLine(); + } + + private String name; + } +} + +namespace D +{ + using B; + + public class Dog + { + public Dog( String name ) { + this.name = name; + } + + public void PrintName() { + name.WriteLine(); + } + + private String name; + } +} + +namespace E +{ + public class Cat + { + public Cat( String name ) { + this.name = name; + } + + public void PrintName() { + name.WriteLine(); + } + + private String name; + } +} + +namespace Demo +{ + using A; + using B; + + public class EntryPoint + { + static void Main() { + C.Employee fred = new C.Employee( "Fred" ); + D.Dog thor = new D.Dog( "Thor" ); + E.Cat sylvester = new E.Cat( "Sylvester" ); + + fred.PrintName(); + thor.PrintName(); + sylvester.PrintName(); + + // String str = "Etouffe"; + // str.WriteLine(); + } + } +} diff --git a/14_extension_methods/transform_1.cs b/14_extension_methods/transform_1.cs new file mode 100644 index 0000000..57c8d95 --- /dev/null +++ b/14_extension_methods/transform_1.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; + +public class TransformExample +{ + static void Main() { + var intList = new List() { 1, 2, 3, 4, 5 }; + + var doubleList = new List(); + + // Compute the new list. + foreach( var item in intList ) { + doubleList.Add( (double) item / 3 ); + Console.WriteLine( item ); + } + Console.WriteLine(); + + // Display the new list. + foreach( var item in doubleList ) { + Console.WriteLine( item ); + } + Console.WriteLine(); + } +} diff --git a/14_extension_methods/transform_2.cs b/14_extension_methods/transform_2.cs new file mode 100644 index 0000000..a019adc --- /dev/null +++ b/14_extension_methods/transform_2.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +public class TransformExample +{ + delegate double Operation( int item ); + + static List Transform( List input, Operation op ) { + List result = new List(); + foreach( var item in input ) { + result.Add( op(item) ); + } + + return result; + } + + static double DivideByThree( int n ) { + return (double)n / 3; + } + + static void Main() { + var intList = new List() { 1, 2, 3, 4, 5 }; + + // Compute the new list. + var doubleList = Transform( intList, DivideByThree ); + + foreach( var item in intList ) { + Console.WriteLine( item ); + } + Console.WriteLine(); + + // Display the new list. + foreach( var item in doubleList ) { + Console.WriteLine( item ); + } + Console.WriteLine(); + } +} diff --git a/14_extension_methods/transform_3.cs b/14_extension_methods/transform_3.cs new file mode 100644 index 0000000..378ef96 --- /dev/null +++ b/14_extension_methods/transform_3.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class MyExtensions +{ + public static IEnumerable Transform( + this IEnumerable input, + Func op ) { + foreach( var item in input ) { + yield return op( item ); + } + } +} + +public class TransformExample +{ + static double DivideByThree( int n ) { + return (double)n / 3; + } + + static void Main() { + var intList = new List() { 1, 2, 3, 4, 5 }; + + // Compute the new list. + var doubleList = + intList.Transform( new Func(DivideByThree) ); + + foreach( var item in intList ) { + Console.WriteLine( item ); + } + Console.WriteLine(); + + // Display the new list. + foreach( var item in doubleList ) { + Console.WriteLine( item ); + } + } +} diff --git a/14_extension_methods/transform_4.cs b/14_extension_methods/transform_4.cs new file mode 100644 index 0000000..dcf2700 --- /dev/null +++ b/14_extension_methods/transform_4.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class MyExtensions +{ + public static IEnumerable Transform( + this IEnumerable input, + Func op ) { + foreach( var item in input ) { + yield return op( item ); + } + } +} + +public class TransformExample +{ + static IEnumerable CreateInfiniteSeries() { + int n = 0; + while( true ) { + yield return n++; + } + } + + static void Main() { + var infiniteSeries1 = CreateInfiniteSeries(); + + var infiniteSeries2 = + infiniteSeries1.Transform( x => (double)x / 3 ); + + IEnumerator iter = + infiniteSeries2.GetEnumerator(); + + for( int i = 0; i < 25; ++i ) { + iter.MoveNext(); + Console.WriteLine( iter.Current ); + } + } +} diff --git a/14_extension_methods/transform_chain_1.cs b/14_extension_methods/transform_chain_1.cs new file mode 100644 index 0000000..4de8664 --- /dev/null +++ b/14_extension_methods/transform_chain_1.cs @@ -0,0 +1,47 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class MyExtensions +{ + public static IEnumerable Transform( + this IEnumerable input, + Func op ) { + foreach( var item in input ) { + yield return op( item ); + } + } +} + +public class TransformExample +{ + static IEnumerable CreateInfiniteList() { + int n = 0; + while( true ) yield return n++; + } + + static double DivideByThree( int n ) { + return (double)n / 3; + } + + static double Square( double r ) { + return r * r; + } + + static void Main() { + var divideByThree = + new Func( DivideByThree ); + var squareNumber = + new Func( Square ); + + var result = CreateInfiniteList(). + Transform( divideByThree ). + Transform( squareNumber ); + + var iter = result.GetEnumerator(); + for( int i = 0; i < 25; ++i ) { + iter.MoveNext(); + Console.WriteLine( iter.Current ); + } + } +} diff --git a/14_extension_methods/visitor_1.cs b/14_extension_methods/visitor_1.cs new file mode 100644 index 0000000..633ed37 --- /dev/null +++ b/14_extension_methods/visitor_1.cs @@ -0,0 +1,51 @@ +using System; +using ValidatorExtensions; + +namespace ValidatorExtensions +{ + public static class Validators + { + public static void Validate( this String str ) { + // Do something to validate the String instance. + + Console.WriteLine( "String with \"" + + str + + "\" Validated." ); + } + + public static void Validate( this SupplyCabinet cab ) { + // Do something to validate the SupplyCabinet instance. + + Console.WriteLine( "Supply Cabinet Validated." ); + } + + public static void Validate( this Employee emp ) { + // Do something to validate the Employee instance. + + Console.WriteLine( "** Employee Failed Validation! **" ); + } + } +} + +public class SupplyCabinet +{ +} + +public class Employee +{ +} + +public class MyApplication +{ + static void Main() { + String data = "some important data"; + + SupplyCabinet supplies = new SupplyCabinet(); + + Employee hrLady = new Employee(); + + data.Validate(); + supplies.Validate(); + hrLady.Validate(); + } +} diff --git a/14_extension_methods/visitor_2.cs b/14_extension_methods/visitor_2.cs new file mode 100644 index 0000000..d457a25 --- /dev/null +++ b/14_extension_methods/visitor_2.cs @@ -0,0 +1,61 @@ +using System; +using ValidatorExtensions; + +namespace ValidatorExtensions +{ + public static class Validators + { + public static void Validate( this String str ) { + // Do something to validate the String instance. + + Console.WriteLine( "String with \"" + + str + + "\" Validated." ); + } + + public static void Validate( this Employee emp ) { + // Do something to validate the Employee instance. + + Console.WriteLine( "** Employee Failed Validation! **" ); + } + + public static void Validate( this T obj ) + where T: IValidator { + obj.DoValidation(); + Console.WriteLine( "Instance of following type" + + " validated: " + + obj.GetType() ); + } + } +} + +public interface IValidator +{ + void DoValidation(); +} + +public class SupplyCabinet : IValidator +{ + public void DoValidation() { + Console.WriteLine( "\tValidating SupplyCabinet" ); + } +} + +public class Employee +{ +} + +public class MyApplication +{ + static void Main() { + String data = "some important data"; + + SupplyCabinet supplies = new SupplyCabinet(); + + Employee hrLady = new Employee(); + + data.Validate(); + supplies.Validate(); + hrLady.Validate(); + } +} diff --git a/14_extension_methods/visitor_3.cs b/14_extension_methods/visitor_3.cs new file mode 100644 index 0000000..634feaa --- /dev/null +++ b/14_extension_methods/visitor_3.cs @@ -0,0 +1,70 @@ +using System; +using ValidatorExtensions; + +namespace ValidatorExtensions +{ + public static class Validators + { + public static void Validate( this String str ) { + // Do something to validate the String instance. + + Console.WriteLine( "String with \"" + + str + + "\" Validated." ); + } + + public static void Validate( this SupplyCabinet cab ) { + // Do something to validate the SupplyCabinet instance. + + Console.WriteLine( "Supply Cabinet Validated." ); + } + + public static void Validate( this Employee emp ) { + // Do something to validate the Employee instance. + + Console.WriteLine( "** Employee Failed Validation! **" ); + } + + public static void Validate( this T obj ) + where T: IValidator { + obj.DoValidation(); + Console.WriteLine( "Instance of following type" + + " validated: " + + obj.GetType() ); + } + } +} + +public interface IValidator +{ + void DoValidation(); +} + +public class SupplyCabinet : IValidator +{ + public void DoValidation() { + Console.WriteLine( "\tValidating SupplyCabinet" ); + } +} + +public class Employee +{ +} + +public class MyApplication +{ + static void Main() { + String data = "some important data"; + + SupplyCabinet supplies = new SupplyCabinet(); + + Employee hrLady = new Employee(); + + data.Validate(); + + // Force generic version + supplies.Validate(); + + hrLady.Validate(); + } +} diff --git a/15_lambda_expressions/closure_1.cs b/15_lambda_expressions/closure_1.cs new file mode 100644 index 0000000..45a1f8b --- /dev/null +++ b/15_lambda_expressions/closure_1.cs @@ -0,0 +1,16 @@ +using System; +using System.Linq; + +public class Closures +{ + static void Main() { + int delta = 1; + Func func = (x) => x + delta; + + int currentVal = 0; + for( int i = 0; i < 10; ++i ) { + currentVal = func( currentVal ); + Console.WriteLine( currentVal ); + } + } +} diff --git a/15_lambda_expressions/compound_lambda_1.cs b/15_lambda_expressions/compound_lambda_1.cs new file mode 100644 index 0000000..fcd167d --- /dev/null +++ b/15_lambda_expressions/compound_lambda_1.cs @@ -0,0 +1,17 @@ +using System; +using System.Linq; + +public class Compound +{ + static Func Chain( Func func1, + Func func2 ) { + return x => func2( func1(x) ); + } + + static void Main() { + Func func = Chain( (int x) => x * 3, + (int x) => x + 3.1415 ); + + Console.WriteLine( func(2) ); + } +} diff --git a/15_lambda_expressions/currying_1.cs b/15_lambda_expressions/currying_1.cs new file mode 100644 index 0000000..e80029a --- /dev/null +++ b/15_lambda_expressions/currying_1.cs @@ -0,0 +1,37 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class CurryExtensions +{ + public static Func + Bind2nd( + this Func func, + TArg2 constant ) { + return (x) => func( x, constant ); + } +} + +public class BinderExample +{ + static void Main() { + var mylist = new List { 1.0, 3.4, 5.4, 6.54 }; + var newlist = new List(); + + // Here is the original expression. + Func func = (x, y) => x + y; + + // Here is the curried function. + var funcBound = func.Bind2nd( 3.2 ); + + foreach( var item in mylist ) { + Console.Write( "{0}, ", item ); + newlist.Add( funcBound(item) ); + } + + Console.WriteLine(); + foreach( var item in newlist ) { + Console.Write( "{0}, ", item ); + } + } +} diff --git a/15_lambda_expressions/currying_2.cs b/15_lambda_expressions/currying_2.cs new file mode 100644 index 0000000..e371f4a --- /dev/null +++ b/15_lambda_expressions/currying_2.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class CurryExtensions +{ + public static Func> + Bind2nd( + this Func func ) { + return (y) => (x) => func( x, y ); + } +} + +public class BinderExample +{ + static void Main() { + var mylist = new List { 1.0, 3.4, 5.4, 6.54 }; + var newlist = new List(); + + // Here is the original expression. + Func func = (x, y) => x + y; + + // Here is the curried function. + var funcBound = func.Bind2nd()(3.2); + + foreach( var item in mylist ) { + Console.Write( "{0}, ", item ); + newlist.Add( funcBound(item) ); + } + + Console.WriteLine(); + foreach( var item in newlist ) { + Console.Write( "{0}, ", item ); + } + } +} diff --git a/15_lambda_expressions/custom_iterators_1a.cs b/15_lambda_expressions/custom_iterators_1a.cs new file mode 100644 index 0000000..2a75bab --- /dev/null +++ b/15_lambda_expressions/custom_iterators_1a.cs @@ -0,0 +1,41 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class IteratorExtensions +{ + public static IEnumerable + MakeCustomIterator( + this TCollection collection, + TCursor cursor, + Func getCurrent, + Func isFinished, + Func advanceCursor) { + while( !isFinished(cursor) ) { + yield return getCurrent( collection, cursor ); + cursor = advanceCursor( cursor ); + } + } +} + +public class IteratorExample +{ + static void Main() { + var matrix = new List> { + new List { 1.0, 1.1, 1.2 }, + new List { 2.0, 2.1, 2.2 }, + new List { 3.0, 3.1, 3.2 } + }; + + var iter = matrix.MakeCustomIterator( + new int[] { 0, 0 }, + (coll, cur) => coll[cur[0]][cur[1]], + (cur) => cur[0] > 2 || cur[1] > 2, + (cur) => new int[] { cur[0] + 1, + cur[1] + 1 } ); + + foreach( var item in iter ) { + Console.WriteLine( item ); + } + } +} diff --git a/15_lambda_expressions/custom_iterators_2.cs b/15_lambda_expressions/custom_iterators_2.cs new file mode 100644 index 0000000..6d903bd --- /dev/null +++ b/15_lambda_expressions/custom_iterators_2.cs @@ -0,0 +1,26 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class IteratorExample +{ + static IEnumerable MakeGenerator( T initialValue, + Func advance ) { + T currentValue = initialValue; + while( true ) { + yield return currentValue; + currentValue = advance( currentValue ); + } + } + + static void Main() { + var iter = MakeGenerator( 1, + x => x * 1.2 ); + + var enumerator = iter.GetEnumerator(); + for( int i = 0; i < 10; ++i ) { + enumerator.MoveNext(); + Console.WriteLine( enumerator.Current ); + } + } +} diff --git a/15_lambda_expressions/expression_tree_1.cs b/15_lambda_expressions/expression_tree_1.cs new file mode 100644 index 0000000..ae51547 --- /dev/null +++ b/15_lambda_expressions/expression_tree_1.cs @@ -0,0 +1,17 @@ +using System; +using System.Linq; +using System.Linq.Expressions; + +public class EntryPoint +{ + static void Main() { + Expression> expr = n => n+1; + + Func func = expr.Compile(); + + for( int i = 0; i < 10; ++i ) { + Console.WriteLine( func(i) ); + } + + } +} diff --git a/15_lambda_expressions/expression_tree_2.cs b/15_lambda_expressions/expression_tree_2.cs new file mode 100644 index 0000000..fb702aa --- /dev/null +++ b/15_lambda_expressions/expression_tree_2.cs @@ -0,0 +1,20 @@ +using System; +using System.Linq; +using System.Linq.Expressions; + +public class EntryPoint +{ + static void Main() { + var n = Expression.Parameter( typeof(int), "n" ); + var expr = Expression>.Lambda>( + Expression.Add(n, Expression.Constant(1)), + n ); + + Func func = expr.Compile(); + + for( int i = 0; i < 10; ++i ) { + Console.WriteLine( func(i) ); + } + + } +} diff --git a/15_lambda_expressions/expression_tree_3.cs b/15_lambda_expressions/expression_tree_3.cs new file mode 100644 index 0000000..0e8ba8b --- /dev/null +++ b/15_lambda_expressions/expression_tree_3.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; +using System.Linq.Expressions; + +public class EntryPoint +{ + static void Main() { + Expression> expr = n => n+1; + + // Now, reassign the expr by multiplying the original + // expression by 2. + expr = Expression>.Lambda>( + Expression.Multiply( expr.Body, + Expression.Constant(2) ), + expr.Parameters ); + + Func func = expr.Compile(); + + for( int i = 0; i < 10; ++i ) { + Console.WriteLine( func(i) ); + } + + } +} diff --git a/15_lambda_expressions/lambda_expression_1.cs b/15_lambda_expressions/lambda_expression_1.cs new file mode 100644 index 0000000..c6f5e45 --- /dev/null +++ b/15_lambda_expressions/lambda_expression_1.cs @@ -0,0 +1,12 @@ +using System; +using System.Linq; + +public class LambdaTest +{ + static void Main() { + Func expr = x => x / 2; + + int someNumber = 9; + Console.WriteLine( "Result: {0}", expr(someNumber) ); + } +} diff --git a/15_lambda_expressions/lambda_expression_2.cs b/15_lambda_expressions/lambda_expression_2.cs new file mode 100644 index 0000000..99dcac4 --- /dev/null +++ b/15_lambda_expressions/lambda_expression_2.cs @@ -0,0 +1,12 @@ +using System; +using System.Linq; + +public class LambdaTest +{ + static void Main() { + Func expr = (double x) => x / 2; + + int someNumber = 9; + Console.WriteLine( "Result: {0}", expr(someNumber) ); + } +} diff --git a/15_lambda_expressions/lambda_expression_3.cs b/15_lambda_expressions/lambda_expression_3.cs new file mode 100644 index 0000000..564b4ed --- /dev/null +++ b/15_lambda_expressions/lambda_expression_3.cs @@ -0,0 +1,21 @@ +using System; +using System.Linq; + +public class LambdaTest +{ + static void Main() { + int counter = 0; + + WriteStream( () => counter++ ); + + Console.WriteLine( "Final value of counter: {0}", + counter ); + } + + static void WriteStream( Func counter ) { + for( int i = 0; i < 10; ++i ) { + Console.Write( "{0}, ", counter() ); + } + Console.WriteLine(); + } +} diff --git a/15_lambda_expressions/lambda_expression_3a.cs b/15_lambda_expressions/lambda_expression_3a.cs new file mode 100644 index 0000000..17e4aa0 --- /dev/null +++ b/15_lambda_expressions/lambda_expression_3a.cs @@ -0,0 +1,41 @@ +using System; + +unsafe public class MyClosure +{ + public MyClosure( int* counter ) + { + this.counter = counter; + } + + public delegate int IncDelegate(); + public IncDelegate GetDelegate() { + return new IncDelegate( IncrementFunction ); + } + + private int IncrementFunction() { + return (*counter)++; + } + + private int* counter; +} + +public class LambdaTest +{ + unsafe static void Main() { + int counter = 0; + + MyClosure closure = new MyClosure( &counter ); + + WriteStream( closure.GetDelegate() ); + + Console.WriteLine( "Final value of counter: {0}", + counter ); + } + + static void WriteStream( MyClosure.IncDelegate incrementor ) { + for( int i = 0; i < 10; ++i ) { + Console.Write( "{0}, ", incrementor() ); + } + Console.WriteLine(); + } +} diff --git a/15_lambda_expressions/lambda_expression_3b.cs b/15_lambda_expressions/lambda_expression_3b.cs new file mode 100644 index 0000000..ff6de7c --- /dev/null +++ b/15_lambda_expressions/lambda_expression_3b.cs @@ -0,0 +1,22 @@ +using System; + +public class LambdaTest +{ + static void Main() { + int counter = 0; + + WriteStream( delegate () { + return counter++; + } ); + + Console.WriteLine( "Final value of counter: {0}", + counter ); + } + + static void WriteStream( Func counter ) { + for( int i = 0; i < 10; ++i ) { + Console.Write( "{0}, ", counter() ); + } + Console.WriteLine(); + } +} diff --git a/15_lambda_expressions/lambda_expression_4.cs b/15_lambda_expressions/lambda_expression_4.cs new file mode 100644 index 0000000..d07f08b --- /dev/null +++ b/15_lambda_expressions/lambda_expression_4.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class LambdaTest +{ + static void Main() { + var teamMembers = new List { + "Lou Loomis", + "Smoke Porterhouse", + "Danny Noonan", + "Ty Webb" + }; + + FindByFirstName( teamMembers, + "Danny", + (x, y) => x.Contains(y) ); + } + + static void FindByFirstName( + List members, + string firstName, + Func predicate ) { + foreach( var member in members ) { + if( predicate(member, firstName) ) { + Console.WriteLine( member ); + } + } + } +} diff --git a/15_lambda_expressions/memoization_1.cs b/15_lambda_expressions/memoization_1.cs new file mode 100644 index 0000000..81893ce --- /dev/null +++ b/15_lambda_expressions/memoization_1.cs @@ -0,0 +1,14 @@ +using System; +using System.Linq; + +public class Proof +{ + static void Main() { + Func fib = null; + fib = (x) => x > 1 ? fib(x-1) + fib(x-2) : x; + + for( int i = 30; i < 40; ++i ) { + Console.WriteLine( fib(i) ); + } + } +} diff --git a/15_lambda_expressions/memoization_2.cs b/15_lambda_expressions/memoization_2.cs new file mode 100644 index 0000000..29c0007 --- /dev/null +++ b/15_lambda_expressions/memoization_2.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class Memoizers +{ + public static Func Memoize( this Func func ) { + var cache = new Dictionary(); + return (x) => { + R result = default(R); + if( cache.TryGetValue(x, out result) ) { + return result; + } + + result = func(x); + cache[x] = result; + return result; + }; + } +} + +public class Proof +{ + static void Main() { + Func fib = null; + fib = (x) => x > 1 ? fib(x-1) + fib(x-2) : x; + fib = fib.Memoize(); + + for( int i = 30; i < 40; ++i ) { + Console.WriteLine( fib(i) ); + } + } +} diff --git a/15_lambda_expressions/memoization_3.cs b/15_lambda_expressions/memoization_3.cs new file mode 100644 index 0000000..5ab052a --- /dev/null +++ b/15_lambda_expressions/memoization_3.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class Memoizers +{ + public static Func Memoize( this Func func ) { + var cache = new Dictionary(); + return (x) => { + R result = default(R); + if( cache.TryGetValue(x, out result) ) { + return result; + } + + result = func(x); + cache[x] = result; + return result; + }; + } +} + +public class Proof +{ + static void Main() { + Func fib = null; + fib = (x) => x > 1 ? fib(x-1) + fib(x-2) : x; + fib = fib.Memoize(); + + Func fibConstant = null; + fibConstant = (x) => { + if( x == 1 ) { + return 1 / ((decimal)fib(x)); + } else { + return 1 / ((decimal)fib(x)) + fibConstant(x-1); + } + }; + fibConstant = fibConstant.Memoize(); + + Console.WriteLine( "\n{0}\t{1}\t{2}\t{3}\n", + "Count", + "Fibonacci".PadRight(24), + "1/Fibonacci".PadRight(24), + "Fibonacci Constant".PadRight(24) ); + + for( ulong i = 1; i <= 93; ++i ) { + Console.WriteLine( "{0:D5}\t{1:D24}\t{2:F24}\t{3:F24}", + i, + fib(i), + (1/(decimal)fib(i)), + fibConstant(i) ); + } + } +} diff --git a/16_linq/custom_sqo_1.cs b/16_linq/custom_sqo_1.cs new file mode 100644 index 0000000..d3d0ac6 --- /dev/null +++ b/16_linq/custom_sqo_1.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; + +public static class MySqoSet +{ + public static IEnumerable Where ( + this IEnumerable source, + System.Func predicate ) { + Console.WriteLine( "My Where implementation called." ); + return System.Linq.Enumerable.Where( source, + predicate ); + } + + public static IEnumerable Select ( + this IEnumerable source, + System.Func selector ) { + Console.WriteLine( "My Select implementation called." ); + return System.Linq.Enumerable.Select( source, + selector ); + } +} + +public class CustomSqo +{ + static void Main() { + int[] numbers = { 1, 2, 3, 4 }; + + var query = from x in numbers + where x % 2 == 0 + select x * 2; + + foreach( var item in query ) { + Console.WriteLine( item ); + } + } +} diff --git a/16_linq/group_1.cs b/16_linq/group_1.cs new file mode 100644 index 0000000..296a626 --- /dev/null +++ b/16_linq/group_1.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; + +public class GroupExample +{ + static void Main() { + int[] numbers = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + }; + + // partition numbers into odd and + // even numbers. + var query = from x in numbers + group x by x % 2; + + foreach( var group in query ) { + Console.WriteLine( "mod2 == {0}", group.Key ); + foreach( var number in group ) { + Console.Write( "{0}, ", number ); + } + Console.WriteLine( "\n" ); + } + } +} diff --git a/16_linq/group_2.cs b/16_linq/group_2.cs new file mode 100644 index 0000000..d9111c1 --- /dev/null +++ b/16_linq/group_2.cs @@ -0,0 +1,52 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string LastName { get; set; } + public string FirstName { get; set; } + public string Nationality { get; set; } +} + +public class OrderByExample +{ + static void Main() { + var employees = new List() { + new Employee { + LastName = "Jones", FirstName = "Ed", + Nationality = "American" + }, + new Employee { + LastName = "Ivanov", FirstName = "Vasya", + Nationality = "Russian" + }, + new Employee { + LastName = "Jones", FirstName = "Tom", + Nationality = "Welsh" + }, + new Employee { + LastName = "Smails", FirstName = "Spaulding", + Nationality = "Irish" + }, + new Employee { + LastName = "Ivanov", FirstName = "Ivan", + Nationality = "Russian" + } + }; + + var query = from emp in employees + group emp by new { + Nationality = emp.Nationality, + LastName = emp.LastName + }; + + foreach( var group in query ) { + Console.WriteLine( group.Key ); + foreach( var employee in group ) { + Console.WriteLine( employee.FirstName ); + } + Console.WriteLine(); + } + } +} diff --git a/16_linq/infinite_1.cs b/16_linq/infinite_1.cs new file mode 100644 index 0000000..4dee0ef --- /dev/null +++ b/16_linq/infinite_1.cs @@ -0,0 +1,22 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class InfiniteList +{ + static IEnumerable AllIntegers() { + int count = 0; + while( true ) { + yield return count++; + } + } + + static void Main() { + var query = from number in AllIntegers() + select number * 2 + 1; + + foreach( var item in query.Take(10) ) { + Console.WriteLine( item ); + } + } +} diff --git a/16_linq/infinite_2.cs b/16_linq/infinite_2.cs new file mode 100644 index 0000000..c7f8758 --- /dev/null +++ b/16_linq/infinite_2.cs @@ -0,0 +1,25 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class InfiniteList +{ + static IEnumerable AllIntegers() { + int count = 0; + while( true ) { + yield return count++; + } + } + + static void Main() { + var query = from number in AllIntegers() + orderby number descending + select number * 2 + 1; + + IEnumerator results = query.GetEnumerator(); + for( int i = 0; i < 10; ++i ) { + results.MoveNext(); + Console.WriteLine( results.Current ); + } + } +} diff --git a/16_linq/into_1.cs b/16_linq/into_1.cs new file mode 100644 index 0000000..535887f --- /dev/null +++ b/16_linq/into_1.cs @@ -0,0 +1,31 @@ +using System; +using System.Linq; + +public class GroupExample +{ + static void Main() { + int[] numbers = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + }; + + // partition numbers into odd and + // even numbers. + var query = from x in numbers + group x by x % 2 into partition + where partition.Key == 0 + select new { + Key = partition.Key, + Count = partition.Count(), + Group = partition + }; + + foreach( var item in query ) { + Console.WriteLine( "mod2 == {0}", item.Key ); + Console.WriteLine( "Count == {0}", item.Count ); + foreach( var number in item.Group ) { + Console.Write( "{0}, ", number ); + } + Console.WriteLine( "\n" ); + } + } +} diff --git a/16_linq/into_2.cs b/16_linq/into_2.cs new file mode 100644 index 0000000..69cae91 --- /dev/null +++ b/16_linq/into_2.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq; + +public class GroupExample +{ + static void Main() { + int[] numbers = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + }; + + // partition numbers into odd and + // even numbers. + var query = from x in numbers + group x by x % 2 into partition + select new { + Key = partition.Key, + Count = partition.Count(), + Group = partition + }; + + foreach( var item in query ) { + Console.WriteLine( "mod2 == {0}", item.Key ); + Console.WriteLine( "Count == {0}", item.Count ); + foreach( var number in item.Group ) { + Console.Write( "{0}, ", number ); + } + Console.WriteLine( "\n" ); + } + } +} diff --git a/16_linq/join_1.cs b/16_linq/join_1.cs new file mode 100644 index 0000000..a97b365 --- /dev/null +++ b/16_linq/join_1.cs @@ -0,0 +1,62 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class EmployeeId +{ + public string Id { get; set; } + public string Name { get; set; } +} + +public class EmployeeNationality +{ + public string Id { get; set; } + public string Nationality { get; set; } +} + +public class JoinExample +{ + static void Main() { + // Build employee collection + var employees = new List() { + new EmployeeId{ Id = "111-11-1111", + Name = "Ed Glasser" }, + new EmployeeId{ Id = "222-22-2222", + Name = "Spaulding Smails" }, + new EmployeeId{ Id = "333-33-3333", + Name = "Ivan Ivanov" }, + new EmployeeId{ Id = "444-44-4444", + Name = "Vasya Pupkin" } + }; + + // Build nationality collection. + var empNationalities = new List() { + new EmployeeNationality{ Id = "111-11-1111", + Nationality = "American" }, + new EmployeeNationality{ Id = "333-33-3333", + Nationality = "Russian" }, + new EmployeeNationality{ Id = "222-22-2222", + Nationality = "Irish" }, + new EmployeeNationality{ Id = "444-44-4444", + Nationality = "Russian" } + }; + + // Build query. + var query = from emp in employees + join n in empNationalities + on emp.Id equals n.Id + orderby n.Nationality descending + select new { + Id = emp.Id, + Name = emp.Name, + Nationality = n.Nationality + }; + + foreach( var person in query ) { + Console.WriteLine( "{0}, {1}, \t{2}", + person.Id, + person.Name, + person.Nationality ); + } + } +} diff --git a/16_linq/let_1.cs b/16_linq/let_1.cs new file mode 100644 index 0000000..a9c5bd7 --- /dev/null +++ b/16_linq/let_1.cs @@ -0,0 +1,39 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string LastName { get; set; } + public string FirstName { get; set; } +} + +public class OrderByExample +{ + static void Main() { + var employees = new List() { + new Employee { + LastName = "Glasser", FirstName = "Ed" + }, + new Employee { + LastName = "Pupkin", FirstName = "Vasya" + }, + new Employee { + LastName = "Smails", FirstName = "Spaulding" + }, + new Employee { + LastName = "Ivanov", FirstName = "Ivan" + } + }; + + var query = from emp in employees + let fullName = emp.FirstName + + " " + emp.LastName + orderby fullName + select fullName; + + foreach( var item in query ) { + Console.WriteLine( item ); + } + } +} diff --git a/16_linq/let_2.cs b/16_linq/let_2.cs new file mode 100644 index 0000000..a3edb61 --- /dev/null +++ b/16_linq/let_2.cs @@ -0,0 +1,23 @@ +using System; +using System.Linq; + +public class MultTable +{ + static void Main() { + var query = from x in Enumerable.Range(0,10) + let innerRange = Enumerable.Range(0, 10) + from y in innerRange + select new { + X = x, + Y = y, + Product = x * y + }; + + foreach( var item in query ) { + Console.WriteLine( "{0} * {1} = {2}", + item.X, + item.Y, + item.Product ); + } + } +} diff --git a/16_linq/linq_onto_console_1.cs b/16_linq/linq_onto_console_1.cs new file mode 100644 index 0000000..d933fdc --- /dev/null +++ b/16_linq/linq_onto_console_1.cs @@ -0,0 +1,24 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public static class Extensions +{ + public static string Join( this string str, + IEnumerable list ) { + return string.Join( str, list.ToArray() ); + } +} + +public class Test +{ + static void Main() { + var numbers = new int[] { 5, 8, 3, 4 }; + + Console.WriteLine( + string.Join(", ", + (from x in numbers + orderby x + select x.ToString()).ToArray()) ); + } +} diff --git a/16_linq/multiple_from_1.cs b/16_linq/multiple_from_1.cs new file mode 100644 index 0000000..406f92b --- /dev/null +++ b/16_linq/multiple_from_1.cs @@ -0,0 +1,22 @@ +using System; +using System.Linq; + +public class MultTable +{ + static void Main() { + var query = from x in Enumerable.Range(0,10) + from y in Enumerable.Range(0,10) + select new { + X = x, + Y = y, + Product = x * y + }; + + foreach( var item in query ) { + Console.WriteLine( "{0} * {1} = {2}", + item.X, + item.Y, + item.Product ); + } + } +} diff --git a/16_linq/non_generic_linq_1.cs b/16_linq/non_generic_linq_1.cs new file mode 100644 index 0000000..04112d2 --- /dev/null +++ b/16_linq/non_generic_linq_1.cs @@ -0,0 +1,19 @@ +using System; +using System.Linq; +using System.Collections; + +public class NonGenericLinq +{ + static void Main() { + ArrayList numbers = new ArrayList(); + numbers.Add( 1 ); + numbers.Add( 2 ); + + var query = from int n in numbers + select n * 2; + + foreach( var item in query ) { + Console.WriteLine( item ); + } + } +} diff --git a/16_linq/orderby_1.cs b/16_linq/orderby_1.cs new file mode 100644 index 0000000..624a16f --- /dev/null +++ b/16_linq/orderby_1.cs @@ -0,0 +1,47 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string LastName { get; set; } + public string FirstName { get; set; } + public string Nationality { get; set; } +} + +public class OrderByExample +{ + static void Main() { + var employees = new List() { + new Employee { + LastName = "Glasser", FirstName = "Ed", + Nationality = "American" + }, + new Employee { + LastName = "Pupkin", FirstName = "Vasya", + Nationality = "Russian" + }, + new Employee { + LastName = "Smails", FirstName = "Spaulding", + Nationality = "Irish" + }, + new Employee { + LastName = "Ivanov", FirstName = "Ivan", + Nationality = "Russian" + } + }; + + var query = from emp in employees + orderby emp.Nationality, + emp.LastName descending, + emp.FirstName descending + select emp; + + foreach( var item in query ) { + Console.WriteLine( "{0},\t{1},\t{2}", + item.LastName, + item.FirstName, + item.Nationality ); + } + } +} diff --git a/16_linq/projector_1.cs b/16_linq/projector_1.cs new file mode 100644 index 0000000..c9a656b --- /dev/null +++ b/16_linq/projector_1.cs @@ -0,0 +1,28 @@ +using System; +using System.Linq; + +public class Result +{ + public Result( int input, int output ) { + Input = input; + Output = output; + } + public int Input { get; set; } + public int Output { get; set; } +} + +public class Projector +{ + static void Main() { + int[] numbers = { 1, 2, 3, 4 }; + + var query = from x in numbers + select new Result( x, x*2 ); + + foreach( var item in query ) { + Console.WriteLine( "Input = {0}, Output = {1}", + item.Input, + item.Output ); + } + } +} diff --git a/16_linq/projector_2.cs b/16_linq/projector_2.cs new file mode 100644 index 0000000..4ed9302 --- /dev/null +++ b/16_linq/projector_2.cs @@ -0,0 +1,20 @@ +using System; +using System.Linq; + +public class Projector +{ + static void Main() { + int[] numbers = { 1, 2, 3, 4 }; + + var query = from x in numbers + select new { + Input = x, + Output = x*2 }; + + foreach( var item in query ) { + Console.WriteLine( "Input = {0}, Output = {1}", + item.Input, + item.Output ); + } + } +} diff --git a/16_linq/simple_query_1.cs b/16_linq/simple_query_1.cs new file mode 100644 index 0000000..093004f --- /dev/null +++ b/16_linq/simple_query_1.cs @@ -0,0 +1,49 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string FirstName { get; set; } + public string LastName { get; set; } + public Decimal Salary { get; set; } + public DateTime StartDate { get; set; } +} + +public class SimpleQuery +{ + static void Main() { + // Create our database of employees. + var employees = new List { + new Employee { + FirstName = "Joe", + LastName = "Bob", + Salary = 94000, + StartDate = DateTime.Parse("1/4/1992") }, + new Employee { + FirstName = "Jane", + LastName = "Doe", + Salary = 123000, + StartDate = DateTime.Parse("4/12/1998") }, + new Employee { + FirstName = "Milton", + LastName = "Waddams", + Salary = 1000000, + StartDate = DateTime.Parse("12/3/1969") } + }; + + var query = from employee in employees + where employee.Salary > 100000 + orderby employee.LastName, employee.FirstName + select new { LastName = employee.LastName, + FirstName = employee.FirstName }; + + Console.WriteLine( "Highly paid employees:" ); + foreach( var item in query ) { + Console.WriteLine( "{0}, {1}", + item.LastName, + item.FirstName ); + } + + } +} diff --git a/16_linq/simple_query_1a.cs b/16_linq/simple_query_1a.cs new file mode 100644 index 0000000..f7ffef0 --- /dev/null +++ b/16_linq/simple_query_1a.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string FirstName { get; set; } + public string LastName { get; set; } + public Decimal Salary { get; set; } + public DateTime StartDate { get; set; } +} + +public class SimpleQuery +{ + static void Main() { + // Create our database of employees. + var employees = new List { + new Employee { + FirstName = "Joe", + LastName = "Bob", + Salary = 94000, + StartDate = DateTime.Parse("1/4/1992") }, + new Employee { + FirstName = "Jane", + LastName = "Doe", + Salary = 123000, + StartDate = DateTime.Parse("4/12/1998") }, + new Employee { + FirstName = "Milton", + LastName = "Waddams", + Salary = 1000000, + StartDate = DateTime.Parse("12/3/1969") } + }; + + var query = from employee in employees + where employee.Salary > 100000 + select new { LastName = employee.LastName, + FirstName = employee.FirstName }; + + Console.WriteLine( "Highly paid employees:" ); + foreach( var item in query ) { + Console.WriteLine( "{0}, {1}", + item.LastName, + item.FirstName ); + } + + } +} diff --git a/16_linq/simple_query_2.cs b/16_linq/simple_query_2.cs new file mode 100644 index 0000000..42f1554 --- /dev/null +++ b/16_linq/simple_query_2.cs @@ -0,0 +1,50 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string FirstName { get; set; } + public string LastName { get; set; } + public Decimal Salary { get; set; } + public DateTime StartDate { get; set; } +} + +public class SimpleQuery +{ + static void Main() { + // Create our database of employees. + var employees = new List { + new Employee { + FirstName = "Joe", + LastName = "Bob", + Salary = 94000, + StartDate = DateTime.Parse("1/4/1992") }, + new Employee { + FirstName = "Jane", + LastName = "Doe", + Salary = 123000, + StartDate = DateTime.Parse("4/12/1998") }, + new Employee { + FirstName = "Milton", + LastName = "Waddams", + Salary = 1000000, + StartDate = DateTime.Parse("12/3/1969") } + }; + + var query = employees + .Where( emp => emp.Salary > 100000 ) + .OrderBy( emp => emp.LastName ) + .OrderBy( emp => emp.FirstName ) + .Select( emp => new {LastName = emp.LastName, + FirstName = emp.FirstName} ); + + Console.WriteLine( "Highly paid employees:" ); + foreach( var item in query ) { + Console.WriteLine( "{0}, {1}", + item.LastName, + item.FirstName ); + } + + } +} diff --git a/16_linq/simple_query_3.cs b/16_linq/simple_query_3.cs new file mode 100644 index 0000000..5ca9f9a --- /dev/null +++ b/16_linq/simple_query_3.cs @@ -0,0 +1,54 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class Employee +{ + public string FirstName { get; set; } + public string LastName { get; set; } + public Decimal Salary { get; set; } + public DateTime StartDate { get; set; } +} + +public class SimpleQuery +{ + static void Main() { + // Create our database of employees. + var employees = new List { + new Employee { + FirstName = "Joe", + LastName = "Bob", + Salary = 94000, + StartDate = DateTime.Parse("1/4/1992") }, + new Employee { + FirstName = "Jane", + LastName = "Doe", + Salary = 123000, + StartDate = DateTime.Parse("4/12/1998") }, + new Employee { + FirstName = "Milton", + LastName = "Waddams", + Salary = 1000000, + StartDate = DateTime.Parse("12/3/1969") } + }; + + var query = + Enumerable.Select( + Enumerable.OrderBy( + Enumerable.OrderBy( + Enumerable.Where( + employees, emp => emp.Salary > 100000), + emp => emp.LastName ), + emp => emp.FirstName ), + emp => new {LastName = emp.LastName, + FirstName = emp.FirstName} ); + + Console.WriteLine( "Highly paid employees:" ); + foreach( var item in query ) { + Console.WriteLine( "{0}, {1}", + item.LastName, + item.FirstName ); + } + + } +} diff --git a/16_linq/sort_non_enum_1.cs b/16_linq/sort_non_enum_1.cs new file mode 100644 index 0000000..1bd2d69 --- /dev/null +++ b/16_linq/sort_non_enum_1.cs @@ -0,0 +1,115 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, CreateList(iter) ); + } + + public MyList( T head, IList tail ) { + this.head = head; + this.tail = tail; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + return tail; + } + } + + private T head; + private IList tail; +} + +public static class MyListExtensions +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func, bool> finalState, + Func, IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } + + public static IList Where( this IList theList, + Func predicate ) { + Func, IList> whereFunc = null; + + whereFunc = list => { + IList result = new MyList(default(T), null); + + if( list.Tail != null ) { + if( predicate(list.Head) ) { + result = new MyList( list.Head, whereFunc(list.Tail) ); + } else { + result = whereFunc( list.Tail ); + } + } + + return result; + }; + + return whereFunc( theList ); + } + + public static IList Select( this IList theList, + Func selector ) { + Func, IList> selectorFunc = null; + + selectorFunc = list => { + IList result = new MyList(default(R), null); + + if( list.Tail != null ) { + result = new MyList( selector(list.Head), selectorFunc(list.Tail) ); + } + + return result; + }; + + return selectorFunc( theList ); + } +} + +public class SqoExample +{ + static void Main() { + var listInts = new List { 5, 2, 9, 4, 3, 1 }; + var linkList = + MyList.CreateList( listInts ); + + // Now sort. + var linkList2 = linkList.Where( x => x > 3 ).Select( x => x * 2 ); + var iterator2 = linkList2.GeneralIterator( list => list.Tail == null, + list => list.Tail ); + foreach( var item in iterator2 ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/16_linq/sort_non_enum_2.cs b/16_linq/sort_non_enum_2.cs new file mode 100644 index 0000000..b65ff5f --- /dev/null +++ b/16_linq/sort_non_enum_2.cs @@ -0,0 +1,167 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public interface IList +{ + T Head { get; } + IList Tail { get; } +} + +public class MyList : IList +{ + public static IList CreateList( IEnumerable items ) { + IEnumerator iter = items.GetEnumerator(); + return CreateList( iter ); + } + + public static IList CreateList( IEnumerator iter ) { + Func> tailGenerator = null; + tailGenerator = () => { + if( !iter.MoveNext() ) { + return new MyList( default(T), null ); + } + + return new MyList( iter.Current, tailGenerator ); + }; + + return tailGenerator(); + } + + public MyList( T head, Func> tailGenerator ) { + this.head = head; + this.tailGenerator = tailGenerator; + } + + public T Head { + get { + return head; + } + } + + public IList Tail { + get { + if( tailGenerator == null ) { + return null; + } else if( tail == null ) { + tail = tailGenerator(); + } + return tail; + } + } + + private T head; + private Func> tailGenerator; + private IList tail = null; +} + +public static class MyListExtensions +{ + public static IEnumerable + GeneralIterator( this IList theList, + Func,bool> finalState, + Func,IList> incrementer ) { + while( !finalState(theList) ) { + yield return theList.Head; + theList = incrementer( theList ); + } + } + + public static IList Where( this IList theList, + Func predicate ) { + Func> whereTailFunc = null; + + whereTailFunc = () => { + IList result = null; + + if( theList.Tail == null ) { + result = new MyList( default(T), null ); + } + + if( predicate(theList.Head) ) { + result = new MyList( theList.Head, + whereTailFunc ); + } + + theList = theList.Tail; + if( result == null ) { + result = whereTailFunc(); + } + + return result; + }; + + return whereTailFunc(); + } + + public static IList Select( this IList theList, + Func selector ) { + Func> selectorTailFunc = null; + + selectorTailFunc = () => { + IList result = null; + + if( theList.Tail == null ) { + result = new MyList( default(R), null ); + } else { + result = new MyList( selector(theList.Head), + selectorTailFunc ); + } + + theList = theList.Tail; + return result; + }; + + return selectorTailFunc(); + } + + public static IList Take( this IList theList, + int count ) { + Func> takeTailFunc = null; + + takeTailFunc = () => { + IList result = null; + + if( theList.Tail == null || count-- == 0 ) { + result = new MyList( default(T), null ); + } else { + result = new MyList( theList.Head, + takeTailFunc ); + } + + theList = theList.Tail; + return result; + }; + + return takeTailFunc(); + } +} + +public class SqoExample +{ + static IList CreateInfiniteList( T item ) { + Func> tailGenerator = null; + + tailGenerator = () => { + return new MyList( item, tailGenerator ); + }; + + return tailGenerator(); + } + + static void Main() { + var infiniteList = CreateInfiniteList( 21 ); + + var linkList = infiniteList.Where( x => x > 3 ) + .Select( x => x * 2 ) + .Take( 10 ); + var iterator = linkList.GeneralIterator( + list => list.Tail == null, + list => list.Tail ); + foreach( var item in iterator ) { + Console.Write( "{0}, ", item ); + } + + Console.WriteLine(); + } +} diff --git a/16_linq/test.cs b/16_linq/test.cs new file mode 100644 index 0000000..81cb51d --- /dev/null +++ b/16_linq/test.cs @@ -0,0 +1,81 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +public class EmployeeId +{ + public string Id { get; set; } + public string Name { get; set; } +} + +public class EmployeeNationality +{ + public string Id { get; set; } + public string Nationality { get; set; } +} + +public class LangSpoken +{ + public string Nationality { get; set; } + public string Language { get; set; } +} + +public class JoinExample +{ + static void Main() { + // Build employee collection + var employees = new List() { + new EmployeeId{ Id = "111-11-1111", + Name = "Ed Glasser" }, + new EmployeeId{ Id = "222-22-2222", + Name = "Spaulding Smails" }, + new EmployeeId{ Id = "333-33-3333", + Name = "Ivan Ivanov" }, + new EmployeeId{ Id = "444-44-4444", + Name = "Vasya Pupkin" } + }; + + // Build nationality collection. + var empNationalities = new List() { + new EmployeeNationality{ Id = "111-11-1111", + Nationality = "American" }, + new EmployeeNationality{ Id = "333-33-3333", + Nationality = "Russian" }, + new EmployeeNationality{ Id = "222-22-2222", + Nationality = "Irish" }, + new EmployeeNationality{ Id = "444-44-4444", + Nationality = "Russian" } + }; + + var langSpoken = new List() { + new LangSpoken{ Nationality = "Russian", + Language = "Russian" }, + new LangSpoken{ Nationality = "Irish", + Language = "The Queen's English" }, + new LangSpoken{ Nationality = "American", + Language = "Refined English" } + }; + + // Build query. + var query = from emp in employees + join n in empNationalities + on emp.Id equals n.Id + join l in langSpoken + on n.Nationality equals l.Nationality + orderby n.Nationality descending + select new { + Id = emp.Id, + Name = emp.Name, + Nationality = n.Nationality, + Language = l.Language + }; + + foreach( var person in query ) { + Console.WriteLine( "{0}, {1}, \t{2}\t {3}", + person.Id, + person.Name, + person.Nationality, + person.Language ); + } + } +} diff --git a/3828.pdf b/3828.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3203a86c905c57bec863279177b3898be3f70f79 GIT binary patch literal 209263 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Μfjb{^m&Wnw5hFMY3kpUyhKoEf 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

T>Q@^GR56us5Hvx8?gAnNV(V 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 literal 0 HcmV?d00001 diff --git a/3_syntax_overview/3_generics_1.cs b/3_syntax_overview/3_generics_1.cs new file mode 100644 index 0000000..f7ddc79 --- /dev/null +++ b/3_syntax_overview/3_generics_1.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +class EntryPoint +{ + static void Main() { + Collection numbers = + new Collection(); + numbers.Add( 42 ); + numbers.Add( 409 ); + + Collection strings = + new Collection(); + strings.Add( "Joe" ); + strings.Add( "Bob" ); + + Collection< Collection > colNumbers + = new Collection>(); + colNumbers.Add( numbers ); + + IList theNumbers = numbers; + foreach( int i in theNumbers ) { + Console.WriteLine( i ); + } + } +} diff --git a/3_syntax_overview/as_1.cs b/3_syntax_overview/as_1.cs new file mode 100644 index 0000000..031b0ee --- /dev/null +++ b/3_syntax_overview/as_1.cs @@ -0,0 +1,39 @@ +using System; + +public class BaseType +{ +} + +public class DerivedType : BaseType +{ +} + +public class EntryPoint +{ + static void Main() { + DerivedType derivedObj = new DerivedType(); + BaseType baseObj1 = new BaseType(); + BaseType baseObj2 = derivedObj; + + DerivedType derivedObj2 = baseObj2 as DerivedType; + if( derivedObj2 != null ) { + Console.WriteLine( "Conversion Succeeded" ); + } else { + Console.WriteLine( "Conversion Failed" ); + } + + derivedObj2 = baseObj1 as DerivedType; + if( derivedObj2 != null ) { + Console.WriteLine( "Conversion Succeeded" ); + } else { + Console.WriteLine( "Conversion Failed" ); + } + + BaseType baseObj3 = derivedObj as BaseType; + if( baseObj3 != null ) { + Console.WriteLine( "Conversion Succeeded" ); + } else { + Console.WriteLine( "Conversion Failed" ); + } + } +} diff --git a/3_syntax_overview/boxing.cs b/3_syntax_overview/boxing.cs new file mode 100644 index 0000000..02e6621 --- /dev/null +++ b/3_syntax_overview/boxing.cs @@ -0,0 +1,13 @@ +public class EntryPoint +{ + static void Main() { + int employeeID = 303; + object boxedID = employeeID; + + employeeID = 404; + int unboxedID = (int) boxedID; + + System.Console.WriteLine( employeeID.ToString() ); + System.Console.WriteLine( unboxedID.ToString() ); + } +} diff --git a/3_syntax_overview/conversions_1.cs b/3_syntax_overview/conversions_1.cs new file mode 100644 index 0000000..336f5e7 --- /dev/null +++ b/3_syntax_overview/conversions_1.cs @@ -0,0 +1,9 @@ +public class EntryPoint +{ + static void Main() { + string[] names = new string[4]; + object[] objects = names; + + string[] originalNames = (string[]) objects; + } +} diff --git a/3_syntax_overview/implicit_type_1.cs b/3_syntax_overview/implicit_type_1.cs new file mode 100644 index 0000000..1faf4ef --- /dev/null +++ b/3_syntax_overview/implicit_type_1.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + var myList = new List(); + + myList.Add( 1 ); + myList.Add( 2 ); + myList.Add( 3 ); + + foreach( var i in myList ) { + Console.WriteLine( i ); + } + } +} diff --git a/3_syntax_overview/is_1.cs b/3_syntax_overview/is_1.cs new file mode 100644 index 0000000..7735cbc --- /dev/null +++ b/3_syntax_overview/is_1.cs @@ -0,0 +1,29 @@ +using System; + +public class EntryPoint +{ + static void Main() { + String derivedObj = "Dummy"; + Object baseObj1 = new Object(); + Object baseObj2 = derivedObj; + + Console.WriteLine( "baseObj2 {0} String", + baseObj2 is String ? "is" : "isnot" ); + Console.WriteLine( "baseObj1 {0} String", + baseObj1 is String ? "is" : "isnot" ); + Console.WriteLine( "derivedObj {0} Object", + derivedObj is Object ? "is" : "isnot" ); + + int j = 123; + object boxed = j; + object obj = new Object(); + + Console.WriteLine( "boxed {0} int", + boxed is int ? "is" : "isnot" ); + Console.WriteLine( "obj {0} int", + obj is int ? "is" : "isnot" ); + Console.WriteLine( "boxed {0} System.ValueType", + boxed is ValueType ? "is" : "isnot" ); + + } +} diff --git a/3_syntax_overview/references_1.cs b/3_syntax_overview/references_1.cs new file mode 100644 index 0000000..77d2d93 --- /dev/null +++ b/3_syntax_overview/references_1.cs @@ -0,0 +1,19 @@ +public class Employee +{ + public string name; +} + +public class EntryPoint +{ + private static void InspectEmployee( Employee someEmployee ) { + someEmployee.name = "Jane"; + } + + static void Main() { + Employee joe = new Employee(); + joe.name = "Joe"; + InspectEmployee( joe ); + + System.Console.WriteLine( "Employee name: {0}", joe.name ); + } +} diff --git a/3_syntax_overview/references_2.cs b/3_syntax_overview/references_2.cs new file mode 100644 index 0000000..ba34e33 --- /dev/null +++ b/3_syntax_overview/references_2.cs @@ -0,0 +1,19 @@ +public class Employee +{ + public string name; +} + +public class EntryPoint +{ + private static void CreateEmployee( Employee someEmployee ) { + someEmployee = new Employee(); + someEmployee.name = "Joe"; + } + + static void Main() { + Employee joe = null; + CreateEmployee( joe ); + + System.Console.WriteLine( "Employee name: {0}", joe.name ); + } +} diff --git a/3_syntax_overview/references_3.cs b/3_syntax_overview/references_3.cs new file mode 100644 index 0000000..6ccebb2 --- /dev/null +++ b/3_syntax_overview/references_3.cs @@ -0,0 +1,19 @@ +public class Employee +{ + public string name; +} + +public class EntryPoint +{ + private static void CreateEmployee( ref Employee someEmployee ) { + someEmployee = new Employee(); + someEmployee.name = "Joe"; + } + + static void Main() { + Employee joe = null; + CreateEmployee( ref joe ); + + System.Console.WriteLine( "Employee name: {0}", joe.name ); + } +} diff --git a/3_syntax_overview/values_1.cs b/3_syntax_overview/values_1.cs new file mode 100644 index 0000000..1fd835b --- /dev/null +++ b/3_syntax_overview/values_1.cs @@ -0,0 +1,30 @@ +public struct Coordinate +{ + public int x; + public int y; +} + +public class EntryPoint +{ + public static void AttemptToModifyCoord( Coordinate coord ) { + coord.x = 1; + coord.y = 3; + } + + public static void ModifyCoord( ref Coordinate coord ) { + coord.x = 10; + coord.y = 10; + } + + static void Main() { + Coordinate location; + location.x = 50; + location.y = 50; + + AttemptToModifyCoord( location ); + System.Console.WriteLine( "( {0}, {1} )", location.x, location.y ); + + ModifyCoord( ref location ); + System.Console.WriteLine( "( {0}, {1} )", location.x, location.y ); + } +} diff --git a/4_classes_structs/4_abstract_classes_1.cs b/4_classes_structs/4_abstract_classes_1.cs new file mode 100644 index 0000000..78fb81b --- /dev/null +++ b/4_classes_structs/4_abstract_classes_1.cs @@ -0,0 +1,25 @@ +public abstract class GeometricShape +{ + public abstract void Draw(); +} + +public class Circle : GeometricShape +{ + public override void Draw() + { + // Do some drawing. + } +} + +public class EntryPoint +{ + static void Main() + { + Circle shape = new Circle(); + + // This won't work! + // GeometricShape shape2 = new GeometricShape(); + + shape.Draw(); + } +} diff --git a/4_classes_structs/4_beforefieldinit_1.cs b/4_classes_structs/4_beforefieldinit_1.cs new file mode 100644 index 0000000..202dbba --- /dev/null +++ b/4_classes_structs/4_beforefieldinit_1.cs @@ -0,0 +1,26 @@ +using System; + +public class A +{ + public A() + { + Console.WriteLine( "A.A()" ); + } + + static int InitX() + { + Console.WriteLine( "A.InitX()" ); + return 1; + } + + public int x = InitX(); +} + +public class EntryPoint +{ + static void Main() + { + // No guarantee A.InitX() is called before this! + A a = new A(); + } +} diff --git a/4_classes_structs/4_box_1.cs b/4_classes_structs/4_box_1.cs new file mode 100644 index 0000000..c03e317 --- /dev/null +++ b/4_classes_structs/4_box_1.cs @@ -0,0 +1,12 @@ +public class EntryPoint +{ + static void Print( object obj ) + { + System.Console.WriteLine( "{0}", obj.ToString() ); + } + static void Main() + { + int x = 42; + Print( x ); + } +} diff --git a/4_classes_structs/4_box_2.cs b/4_classes_structs/4_box_2.cs new file mode 100644 index 0000000..ff9cf79 --- /dev/null +++ b/4_classes_structs/4_box_2.cs @@ -0,0 +1,15 @@ +public class EntryPoint +{ + static void PrintAndModify( object obj ) + { + System.Console.WriteLine( "{0}", obj.ToString() ); + int x = (int) obj; + x = 21; + } + static void Main() + { + int x = 42; + PrintAndModify( x ); + PrintAndModify( x ); + } +} diff --git a/4_classes_structs/4_box_3.cs b/4_classes_structs/4_box_3.cs new file mode 100644 index 0000000..d004b58 --- /dev/null +++ b/4_classes_structs/4_box_3.cs @@ -0,0 +1,57 @@ +public interface IModifyMyValue +{ + int X + { + get; + set; + } +} + +public struct MyValue : IModifyMyValue +{ + public int x; + + public int X + { + get + { + return x; + } + + set + { + x = value; + } + } + + public override string ToString() + { + System.Text.StringBuilder output = + new System.Text.StringBuilder(); + output.AppendFormat( "{0}", x ); + return output.ToString(); + } +} + +public class EntryPoint +{ + static void Main() + { + // Create value + MyValue myval = new MyValue(); + myval.x = 123; + + // box it + object obj = myval; + System.Console.WriteLine( "{0}", obj.ToString() ); + + // modify the contents in the box. + IModifyMyValue iface = (IModifyMyValue) obj; + iface.X = 456; + System.Console.WriteLine( "{0}", obj.ToString() ); + + // unbox it and see what it is. + MyValue newval = (MyValue) obj; + System.Console.WriteLine( "{0}", newval.ToString() ); + } +} diff --git a/4_classes_structs/4_box_4.cs b/4_classes_structs/4_box_4.cs new file mode 100644 index 0000000..a04eb06 --- /dev/null +++ b/4_classes_structs/4_box_4.cs @@ -0,0 +1,30 @@ +public interface IPrint +{ + void Print(); +} + +public struct MyValue : IPrint +{ + public int x; + + public void Print() + { + System.Console.WriteLine( "{0}", x ); + } +} + +public class EntryPoint +{ + static void Main() + { + MyValue myval = new MyValue(); + myval.x = 123; + + // no boxing + myval.Print(); + + // must box the value + IPrint printer = myval; + printer.Print(); + } +} diff --git a/4_classes_structs/4_box_5.cs b/4_classes_structs/4_box_5.cs new file mode 100644 index 0000000..ab0dcfe --- /dev/null +++ b/4_classes_structs/4_box_5.cs @@ -0,0 +1,27 @@ +public interface IPrint +{ + void Print(); +} + +public struct MyValue : IPrint +{ + public int x; + + void IPrint.Print() + { + System.Console.WriteLine( "{0}", x ); + } +} + +public class EntryPoint +{ + static void Main() + { + MyValue myval = new MyValue(); + myval.x = 123; + + // must box the value + IPrint printer = myval; + printer.Print(); + } +} diff --git a/4_classes_structs/4_class_definition_1.cs b/4_classes_structs/4_class_definition_1.cs new file mode 100644 index 0000000..b6df7dc --- /dev/null +++ b/4_classes_structs/4_class_definition_1.cs @@ -0,0 +1,13 @@ +[Serializable] +public class Derived : Base, ICloneable +{ + private Derived( Derived other ) { + this.x = other.x; + } + + public object Clone() { + return new Derived( this ); + } + + private int x; +} diff --git a/4_classes_structs/4_compareto_1.cs b/4_classes_structs/4_compareto_1.cs new file mode 100644 index 0000000..2fd9e69 --- /dev/null +++ b/4_classes_structs/4_compareto_1.cs @@ -0,0 +1,90 @@ +public class ComplexNumber : System.IComparable +{ + public ComplexNumber( int real, int imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public override bool Equals( object obj ) + { + ComplexNumber other = obj as ComplexNumber; + + if( other == null ) + { + return false; + } + + return (this.real == other.real) && + (this.imaginary == other.imaginary); + } + + public override int GetHashCode() + { + return (int) real ^ (int) imaginary; + } + + public static bool operator==( ComplexNumber me, ComplexNumber other ) + { + return Equals( me, other ); + } + + public static bool operator!=( ComplexNumber me, ComplexNumber other ) + { + return Equals( me, other ); + } + + public double Magnitude + { + get + { + return System.Math.Sqrt( System.Math.Pow(this.real, 2) + + System.Math.Pow(this.imaginary, 2) ); + } + } + + public int CompareTo( object obj ) + { + if( obj is ComplexNumber ) + { + ComplexNumber other = (ComplexNumber) obj; + + if( (this.real == other.real) && + (this.imaginary == other.imaginary) ) + { + return 0; + } + else if( this.Magnitude < other.Magnitude ) + { + return -1; + } + else + { + return 1; + } + } + else + { + throw new System.ArgumentException( "Wrong type" ); + } + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() + { + ComplexNumber referenceA = new ComplexNumber( 1, 2 ); + ComplexNumber referenceB = new ComplexNumber( 1, 2 ); + ComplexNumber referenceC = new ComplexNumber( 1, 3 ); + + System.Console.WriteLine( "Result of referenceA.CompareTo(referenceB) is {0}", + referenceA.CompareTo(referenceB) ); + System.Console.WriteLine( "Result of referenceA.CompareTo(referenceC) is {0}", + referenceA.CompareTo(referenceC) ); + + } +} diff --git a/4_classes_structs/4_containment_example_1.cs b/4_classes_structs/4_containment_example_1.cs new file mode 100644 index 0000000..57a0708 --- /dev/null +++ b/4_classes_structs/4_containment_example_1.cs @@ -0,0 +1,12 @@ +public class NetworkCommunicator +{ + public void SendData( DataObject obj ) + { + // Send the data over the wire. + } + + public DataObject ReceiveData() + { + // Receive data over the wire. + } +} diff --git a/4_classes_structs/4_containment_example_2.cs b/4_classes_structs/4_containment_example_2.cs new file mode 100644 index 0000000..eecbb86 --- /dev/null +++ b/4_classes_structs/4_containment_example_2.cs @@ -0,0 +1,17 @@ +public class EncryptedNetworkCommunicator : NetworkCommunicator +{ + public override void SendData( DataObject obj ) + { + // Encrypt the data. + base.SendData( obj ); + } + + public override DataObject ReceiveData() + { + DataObject obj = base.ReceiveData(); + + // Decrypt data. + + return obj; + } +} diff --git a/4_classes_structs/4_containment_example_3.cs b/4_classes_structs/4_containment_example_3.cs new file mode 100644 index 0000000..e312f5f --- /dev/null +++ b/4_classes_structs/4_containment_example_3.cs @@ -0,0 +1,24 @@ +public class EncryptedNetworkCommunicator +{ + public EncryptedNetworkCommunicator() + { + contained = new NetworkCommunicator(); + } + + public void SendData( DataObject obj ) + { + // Encrypt the data. + contained.SendData( obj ); + } + + public DataObject ReceiveData() + { + DataObject obj = contained.ReceiveData(); + + // Decrypt data + + return obj; + } + + private NetworkCommunicator contained; +} diff --git a/4_classes_structs/4_ctor_struct_1.cs b/4_classes_structs/4_ctor_struct_1.cs new file mode 100644 index 0000000..a3c8f64 --- /dev/null +++ b/4_classes_structs/4_ctor_struct_1.cs @@ -0,0 +1,26 @@ +using System; + +public struct Square +{ + // Not a good idea to have public fields, but I use them + // here only for the sake of example. Prefer to expose + // these with properties instead. + public int width; + public int height; +} + +public class EntryPoint +{ + static void Main() + { + Square sq; + sq.width = 1; + + // Can't do this yet. + // Console.WriteLine( "{0} x {1}", sq.width, sq.height ); + + sq.height = 2; + + Console.WriteLine( "{0} x {1}", sq.width, sq.height ); + } +} diff --git a/4_classes_structs/4_ctor_struct_2.cs b/4_classes_structs/4_ctor_struct_2.cs new file mode 100644 index 0000000..8c44c4f --- /dev/null +++ b/4_classes_structs/4_ctor_struct_2.cs @@ -0,0 +1,43 @@ +using System; + +public struct Square +{ + public int Width + { + get + { + return width; + } + + set + { + width = value; + } + } + + public int Height + { + get + { + return height; + } + + set + { + height = value; + } + } + + private int width; + private int height; +} + +public class EntryPoint +{ + static void Main() + { + Square sq; + sq.Width = 1; + sq.Height = 1; + } +} diff --git a/4_classes_structs/4_ctor_struct_3.cs b/4_classes_structs/4_ctor_struct_3.cs new file mode 100644 index 0000000..a681b69 --- /dev/null +++ b/4_classes_structs/4_ctor_struct_3.cs @@ -0,0 +1,9 @@ +public class EntryPoint +{ + static void Main() + { + Square sq = new Square(); + sq.Width = 1; + sq.Height = 1; + } +} diff --git a/4_classes_structs/4_destructor_1.cs b/4_classes_structs/4_destructor_1.cs new file mode 100644 index 0000000..b1e80d9 --- /dev/null +++ b/4_classes_structs/4_destructor_1.cs @@ -0,0 +1,25 @@ +using System; + +public class Base +{ + ~Base() + { + Console.WriteLine( "Base.~Base()" ); + } +} + +public class Derived : Base +{ + ~Derived() + { + Console.WriteLine( "Derived.~Derived()" ); + } +} + +public class EntryPoint +{ + static void Main() + { + Derived derived = new Derived(); + } +} diff --git a/4_classes_structs/4_destructor_2.cs b/4_classes_structs/4_destructor_2.cs new file mode 100644 index 0000000..470b573 --- /dev/null +++ b/4_classes_structs/4_destructor_2.cs @@ -0,0 +1,33 @@ +using System; + +public class A +{ + ~A() + { + Console.WriteLine( "A.~A()" ); + + // Store away a reference to ourselves. + EntryPoint.obj = this; + } + + private object objA; + private object ojbB; +} + +public class EntryPoint +{ + internal static A obj; + + static void Main() + { + { + A a = new A(); + } + + // Force a collect. + GC.Collect(); + GC.WaitForPendingFinalizers(); + + Console.WriteLine( "Done" ); + } +} diff --git a/4_classes_structs/4_destructor_3.cs b/4_classes_structs/4_destructor_3.cs new file mode 100644 index 0000000..65b0b34 --- /dev/null +++ b/4_classes_structs/4_destructor_3.cs @@ -0,0 +1,34 @@ +using System; + +public class A +{ + ~A() + { + Console.WriteLine( "A.~A()" ); + + // Store away a reference to ourselves. + EntryPoint.obj = this; + GC.ReRegisterForFinalize( this ); + } + + private object objA; + private object ojbB; +} + +public class EntryPoint +{ + internal static A obj; + + static void Main() + { + { + A a = new A(); + } + + // Force a collect. + GC.Collect(); + GC.WaitForPendingFinalizers(); + + Console.WriteLine( "Done" ); + } +} diff --git a/4_classes_structs/4_disposable.cs b/4_classes_structs/4_disposable.cs new file mode 100644 index 0000000..867a57e --- /dev/null +++ b/4_classes_structs/4_disposable.cs @@ -0,0 +1,47 @@ +using System; + +public class A : IDisposable +{ + private bool disposed = false; + public void Dispose( bool disposing ) + { + if( !disposed ) { + if( disposing ) { + // It is safe to access other objects here. + } + + Console.WriteLine( "Cleaning up object" ); + disposed = true; + } + } + public void Dispose() + { + Dispose( true ); + GC.SuppressFinalize( this ); + } + + public void DoSomething() + { + Console.WriteLine( "A.SoSomething()" ); + } + + ~A() + { + Console.WriteLine( "Finalizing" ); + Dispose( false ); + } +} + +public class EntryPoint +{ + static void Main() + { + A a = new A(); + try { + a.DoSomething(); + } + finally { + a.Dispose(); + } + } +} diff --git a/4_classes_structs/4_disposable_2.cs b/4_classes_structs/4_disposable_2.cs new file mode 100644 index 0000000..eeb97c1 --- /dev/null +++ b/4_classes_structs/4_disposable_2.cs @@ -0,0 +1,48 @@ +using System; + +public class A : IDisposable +{ + private bool disposed = false; + public void Dispose( bool disposing ) + { + if( !disposed ) { + if( disposing ) { + // It is safe to access other objects here. + } + + Console.WriteLine( "Cleaning up object" ); + disposed = true; + } + } + public void Dispose() + { + Dispose( true ); + GC.SuppressFinalize( this ); + } + + public void DoSomething() + { + Console.WriteLine( "A.SoSomething()" ); + } + + ~A() + { + Console.WriteLine( "Finalizing" ); + Dispose( false ); + } +} + +public class EntryPoint +{ + static void Main() + { + using( A a = new A() ) { + a.DoSomething(); + } + + using( A a = new A(), b = new A() ) { + a.DoSomething(); + b.DoSomething(); + } + } +} diff --git a/4_classes_structs/4_encapsulation_example_1.cs b/4_classes_structs/4_encapsulation_example_1.cs new file mode 100644 index 0000000..0c801f5 --- /dev/null +++ b/4_classes_structs/4_encapsulation_example_1.cs @@ -0,0 +1,5 @@ +class MyRectangle +{ + public uint width; + public uint height; +} diff --git a/4_classes_structs/4_encapsulation_example_2.cs b/4_classes_structs/4_encapsulation_example_2.cs new file mode 100644 index 0000000..002652c --- /dev/null +++ b/4_classes_structs/4_encapsulation_example_2.cs @@ -0,0 +1,10 @@ +class MyRectangle +{ + public uint width; + public uint height; + + public uint GetArea() + { + return width * height; + } +} diff --git a/4_classes_structs/4_encapsulation_example_3.cs b/4_classes_structs/4_encapsulation_example_3.cs new file mode 100644 index 0000000..5190ceb --- /dev/null +++ b/4_classes_structs/4_encapsulation_example_3.cs @@ -0,0 +1,12 @@ +class MyRectangle +{ + public uint width; + public uint height; + + public uint area; + + public uint GetArea() + { + return area; + } +} diff --git a/4_classes_structs/4_encapsulation_example_4.cs b/4_classes_structs/4_encapsulation_example_4.cs new file mode 100644 index 0000000..102e8d5 --- /dev/null +++ b/4_classes_structs/4_encapsulation_example_4.cs @@ -0,0 +1,16 @@ +class MyRectangle +{ + public uint width; + public uint height; + + private uint area; + + public uint GetArea() + { + if( area == 0 ) { + area = width * height; + } + + return area; + } +} diff --git a/4_classes_structs/4_encapsulation_example_5.cs b/4_classes_structs/4_encapsulation_example_5.cs new file mode 100644 index 0000000..5dd528a --- /dev/null +++ b/4_classes_structs/4_encapsulation_example_5.cs @@ -0,0 +1,47 @@ +class MyRectangle +{ + private uint width; + private uint height; + private uint area; + + public uint Width + { + get + { + return width; + } + + set + { + width = value; + ComputeArea(); + } + } + + public uint Height + { + get + { + return height; + } + + set + { + height = value; + ComputeArea(); + } + } + + public uint Area + { + get + { + return area; + } + } + + private void ComputeArea() + { + area = width * height; + } +} diff --git a/4_classes_structs/4_equality_2.cs b/4_classes_structs/4_equality_2.cs new file mode 100644 index 0000000..94b5467 --- /dev/null +++ b/4_classes_structs/4_equality_2.cs @@ -0,0 +1,21 @@ +public class EntryPoint +{ + static bool TestForEquality( object obj1, object obj2 ) + { + if( obj1 == null ) + { + return false; + } + + return obj1.Equals( obj2 ); + } + + static void Main() + { + object obj1 = new System.Object(); + object obj2 = null; + + System.Console.WriteLine( "obj1 == obj2 is {0}", + TestForEquality(obj2, obj1) ); + } +} diff --git a/4_classes_structs/4_field_init_1.cs b/4_classes_structs/4_field_init_1.cs new file mode 100644 index 0000000..ef91862 --- /dev/null +++ b/4_classes_structs/4_field_init_1.cs @@ -0,0 +1,39 @@ +using System; + +public class A +{ + private static int InitX() + { + Console.WriteLine( "A.InitX()" ); + return 1; + } + private static int InitY() + { + Console.WriteLine( "A.InitY()" ); + return 2; + } + private static int InitA() + { + Console.WriteLine( "A.InitA()" ); + return 3; + } + private static int InitB() + { + Console.WriteLine( "A.InitB()" ); + return 4; + } + + private int y = InitY(); + private int x = InitX(); + + private static int a = InitA(); + private static int b = InitB(); +} + +public class EntryPoint +{ + static void Main() + { + A a = new A(); + } +} diff --git a/4_classes_structs/4_field_initializers_1.cs b/4_classes_structs/4_field_initializers_1.cs new file mode 100644 index 0000000..2d2c2b3 --- /dev/null +++ b/4_classes_structs/4_field_initializers_1.cs @@ -0,0 +1,24 @@ +public class A +{ + public A() + { + this.y = 123; + } + + private static int InitZ() + { + return 987; + } + + private int x = 789; + private int y; + private int z = A.InitZ(); + + static void Main() + { + A obj = new A(); + + System.Console.WriteLine( "x = {0}, y = {1}, z = {2}", + obj.x, obj.y, obj.z ); + } +} diff --git a/4_classes_structs/4_indexer_1.cs b/4_classes_structs/4_indexer_1.cs new file mode 100644 index 0000000..dace043 --- /dev/null +++ b/4_classes_structs/4_indexer_1.cs @@ -0,0 +1,71 @@ +using System.Collections; + +public abstract class GeometricShape +{ + public abstract void Draw(); +} + +public class Rectangle : GeometricShape +{ + public override void Draw() + { + System.Console.WriteLine( "Rectangle.Draw" ); + } +} + +public class Circle : GeometricShape +{ + public override void Draw() + { + System.Console.WriteLine( "Circle.Draw" ); + } +} + +public class Drawing +{ + private ArrayList shapes; + + public Drawing() + { + shapes = new ArrayList(); + } + + public int Count + { + get + { + return shapes.Count; + } + } + + public GeometricShape this[ int index ] + { + get + { + return (GeometricShape) shapes[index]; + } + } + + public void Add( GeometricShape shape ) + { + shapes.Add( shape ); + } +} + +public class EntryPoint +{ + static void Main() + { + Rectangle rectangle = new Rectangle(); + Circle circle = new Circle(); + Drawing drawing = new Drawing(); + + drawing.Add( rectangle ); + drawing.Add( circle ); + + for( int i = 0; i < drawing.Count; ++i ) { + GeometricShape shape = drawing[i]; + shape.Draw(); + } + } +} diff --git a/4_classes_structs/4_inheritance_1.cs b/4_classes_structs/4_inheritance_1.cs new file mode 100644 index 0000000..7c1d08e --- /dev/null +++ b/4_classes_structs/4_inheritance_1.cs @@ -0,0 +1,27 @@ +public class Base +{ + public void Base(); + + public void DoSomething() + { + // Doing something + } +} + +public interface ISomeInterface +{ + void DoSomethingElse(); +} + +public class Derived : Base, ISomeInterface +{ + public void DoSomethingElse() + { + // doing something else + } + + public void DoSomethingCompletelyDifferent() + { + // doing something completely different. + } +} diff --git a/4_classes_structs/4_inheritance_2.cs b/4_classes_structs/4_inheritance_2.cs new file mode 100644 index 0000000..d69cfca --- /dev/null +++ b/4_classes_structs/4_inheritance_2.cs @@ -0,0 +1,8 @@ +class A +{ + protected int x; +} + +public class B : A +{ +} diff --git a/4_classes_structs/4_inheritance_3.cs b/4_classes_structs/4_inheritance_3.cs new file mode 100644 index 0000000..ade9e5b --- /dev/null +++ b/4_classes_structs/4_inheritance_3.cs @@ -0,0 +1,26 @@ +public class A +{ + public void DoSomething() + { + System.Console.WriteLine( "A.DoSomething" ); + } +} + +public class B : A +{ + public void DoSomethingElse() + { + System.Console.WriteLine( "B.DoSomethingElse" ); + } +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + + b.DoSomething(); + b.DoSomethingElse(); + } +} diff --git a/4_classes_structs/4_inheritance_4.cs b/4_classes_structs/4_inheritance_4.cs new file mode 100644 index 0000000..18e38d8 --- /dev/null +++ b/4_classes_structs/4_inheritance_4.cs @@ -0,0 +1,34 @@ +public class A +{ + public void DoSomething() + { + System.Console.WriteLine( "A.DoSomething" ); + } +} + +public class B : A +{ + public void DoSomethingElse() + { + System.Console.WriteLine( "B.DoSomethingElse" ); + } + + public new void DoSomething() + { + System.Console.WriteLine( "B.DoSomething" ); + } +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + + b.DoSomething(); + b.DoSomethingElse(); + + A a = b; + a.DoSomething(); + } +} diff --git a/4_classes_structs/4_inheritance_5.cs b/4_classes_structs/4_inheritance_5.cs new file mode 100644 index 0000000..9292529 --- /dev/null +++ b/4_classes_structs/4_inheritance_5.cs @@ -0,0 +1,39 @@ +public class A +{ + public A( int var ) + { + this.x = var; + } + + public virtual void DoSomething() + { + System.Console.WriteLine( "A.DoSomething" ); + } + + private int x; +} + +public class B : A +{ + public B() + : base( 123 ) + { + } + + public override void DoSomething() + { + System.Console.WriteLine( "B.DoSomething" ); + base.DoSomething(); + } + +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + + b.DoSomething(); + } +} diff --git a/4_classes_structs/4_inst_ctor_1.cs b/4_classes_structs/4_inst_ctor_1.cs new file mode 100644 index 0000000..a0963a0 --- /dev/null +++ b/4_classes_structs/4_inst_ctor_1.cs @@ -0,0 +1,59 @@ +using System; + +class Base +{ + public Base( int x ) + { + Console.WriteLine( "Base.Base(int)" ); + this.x = x; + } + + private static int InitX() + { + Console.WriteLine( "Base.InitX()" ); + return 1; + } + + public int x = InitX(); +} + +class Derived : Base +{ + public Derived( int a ) + :base( a ) + { + Console.WriteLine( "Derived.Derived(int)" ); + this.a = a; + } + + public Derived( int a, int b ) + :this( a ) + { + Console.WriteLine( "Derived.Derived(int, int)" ); + this.a = a; + this.b = b; + } + + private static int InitA() + { + Console.WriteLine( "Derived.InitA()" ); + return 3; + } + + private static int InitB() + { + Console.WriteLine( "Derived.InitB()" ); + return 4; + } + + public int a = InitA(); + public int b = InitB(); +} + +public class EntryPoint +{ + static void Main() + { + Derived b = new Derived( 1, 2 ); + } +} diff --git a/4_classes_structs/4_inst_ctor_2.cs b/4_classes_structs/4_inst_ctor_2.cs new file mode 100644 index 0000000..e09c890 --- /dev/null +++ b/4_classes_structs/4_inst_ctor_2.cs @@ -0,0 +1,38 @@ +using System; + +public class A +{ + public virtual void DoSomething() + { + Console.WriteLine( "A.DoSomething()" ); + } + + public A() + { + DoSomething(); + } +} + +public class B : A +{ + public override void DoSomething() + { + Console.WriteLine( "B.DoSomething()" ); + Console.WriteLine( "x = {0}", x ); + } + + public B() + :base() + { + } + + private int x = 123; +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + } +} diff --git a/4_classes_structs/4_inst_init_1.cs b/4_classes_structs/4_inst_init_1.cs new file mode 100644 index 0000000..ba50ec2 --- /dev/null +++ b/4_classes_structs/4_inst_init_1.cs @@ -0,0 +1,20 @@ +public class A +{ + public A(int x) { + this.x = x; + } + + private int x; +} + +public class B : A +{ +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + } +} diff --git a/4_classes_structs/4_instance_ctor_1.cs b/4_classes_structs/4_instance_ctor_1.cs new file mode 100644 index 0000000..fec943b --- /dev/null +++ b/4_classes_structs/4_instance_ctor_1.cs @@ -0,0 +1,33 @@ +public class A +{ + public A( int x ) + { + this.x = x; + } + + public A() : this( 123 ) + { + } + + internal int x; +} + +public class B : A +{ + public B() : base( 456 ) + { + } + + ~B() + { + } +} + +public class EntryPoint +{ + static void Main() + { + B b = new B(); + System.Console.WriteLine( "A.x = {0}", b.x ); + } +} diff --git a/4_classes_structs/4_instance_method_1.cs b/4_classes_structs/4_instance_method_1.cs new file mode 100644 index 0000000..59444d8 --- /dev/null +++ b/4_classes_structs/4_instance_method_1.cs @@ -0,0 +1,27 @@ +public class A +{ + private void SomeOperation() + { + x = 1; + this.y = 2; + z = 3; + + // assigning this in objects is an error. + // A newinstance = new A(); + // this = newinstance; + } + + private int x; + private int y; + private static int z; + + static void Main() + { + A obj = new A(); + + obj.SomeOperation(); + + System.Console.WriteLine( "x = {0}, y = {1}, z= {2}", + obj.x, obj.y, A.z ); + } +} diff --git a/4_classes_structs/4_interface_1.cs b/4_classes_structs/4_interface_1.cs new file mode 100644 index 0000000..c3966b5 --- /dev/null +++ b/4_classes_structs/4_interface_1.cs @@ -0,0 +1,23 @@ +public interface IMusician +{ + void PlayMusic(); +} + +public class TalentedPerson : IMusician +{ + void PlayMusic(); + void DoALittleDance(); +} + +public class EntryPoint +{ + static void Main() + { + TalentedPerson dude = new TalentedPerson(); + IMusician musician = dude; + + musician.PlayMusic(); + dude.PlayMusic(); + dude.DoALittleDance(); + } +} diff --git a/4_classes_structs/4_nested_classes_1.cs b/4_classes_structs/4_nested_classes_1.cs new file mode 100644 index 0000000..1275ee4 --- /dev/null +++ b/4_classes_structs/4_nested_classes_1.cs @@ -0,0 +1,94 @@ +using System.Collections; + +public abstract class GeometricShape +{ + public abstract void Draw(); +} + +public class Rectangle : GeometricShape +{ + public override void Draw() + { + System.Console.WriteLine( "Rectangle.Draw" ); + } +} + +public class Circle : GeometricShape +{ + public override void Draw() + { + System.Console.WriteLine( "Circle.Draw" ); + } +} + +public class Drawing : IEnumerable +{ + private ArrayList shapes; + + private class Iterator : IEnumerator + { + public Iterator( Drawing drawing ) + { + this.drawing = drawing; + this.current = -1; + } + + public void Reset() + { + current = -1; + } + + public bool MoveNext() + { + ++current; + if( current < drawing.shapes.Count ) { + return true; + } else { + return false; + } + } + + public object Current + { + get + { + return drawing.shapes[ current ]; + } + } + + private Drawing drawing; + private int current; + } + + public Drawing() + { + shapes = new ArrayList(); + } + + public IEnumerator GetEnumerator() + { + return new Iterator( this ); + } + + public void Add( GeometricShape shape ) + { + shapes.Add( shape ); + } +} + +public class EntryPoint +{ + static void Main() + { + Rectangle rectangle = new Rectangle(); + Circle circle = new Circle(); + Drawing drawing = new Drawing(); + + drawing.Add( rectangle ); + drawing.Add( circle ); + + foreach( GeometricShape shape in drawing ) { + shape.Draw(); + } + } +} diff --git a/4_classes_structs/4_nested_classes_2.cs b/4_classes_structs/4_nested_classes_2.cs new file mode 100644 index 0000000..4b3b6a2 --- /dev/null +++ b/4_classes_structs/4_nested_classes_2.cs @@ -0,0 +1,14 @@ +public class A +{ + public class B + { + } +} + +public class EntryPoint +{ + static void Main() + { + A.B b = new A.B(); + } +} diff --git a/4_classes_structs/4_nested_classes_3.cs b/4_classes_structs/4_nested_classes_3.cs new file mode 100644 index 0000000..51d23e5 --- /dev/null +++ b/4_classes_structs/4_nested_classes_3.cs @@ -0,0 +1,13 @@ +public class A +{ + public void Foo() + { + } +} + +public class B : A +{ + public new class Foo + { + } +} diff --git a/4_classes_structs/4_new_2.cs b/4_classes_structs/4_new_2.cs new file mode 100644 index 0000000..bab0c6a --- /dev/null +++ b/4_classes_structs/4_new_2.cs @@ -0,0 +1,24 @@ +public class MyClass +{ + public MyClass( int x, int y ) + { + this.x = x; + this.y = y; + } + + public int x; + public int y; +} + +public class EntryPoint +{ + static void Main() + { + // We can't do this! + // MyClass objA = new MyClass(); + + MyClass objA = new MyClass( 1, 2 ); + System.Console.WriteLine( "objA.x = {0}, objA.y = {1}", + objA.x, objA.y ); + } +} diff --git a/4_classes_structs/4_out_param_1.cs b/4_classes_structs/4_out_param_1.cs new file mode 100644 index 0000000..090c853 --- /dev/null +++ b/4_classes_structs/4_out_param_1.cs @@ -0,0 +1,11 @@ +public class EntryPoint +{ + static void Main() { + object obj; + PassAsOutParam( out obj ); + } + + static void PassAsOutParam( out object obj ) { + obj = new object(); + } +} diff --git a/4_classes_structs/4_override_1.cs b/4_classes_structs/4_override_1.cs new file mode 100644 index 0000000..ea486c2 --- /dev/null +++ b/4_classes_structs/4_override_1.cs @@ -0,0 +1,25 @@ +using System; + +public class A +{ + public virtual void SomeMethod() { + Console.WriteLine( "A::SomeMethod" ); + } +} + +public class B : A +{ + public void SomeMethod() { + Console.WriteLine( "B::SomeMethod" ); + } +} + +public class EntryPoint +{ + static void Main() { + B b = new B(); + A a = b; + + a.SomeMethod(); + } +} diff --git a/4_classes_structs/4_override_2.cs b/4_classes_structs/4_override_2.cs new file mode 100644 index 0000000..4956679 --- /dev/null +++ b/4_classes_structs/4_override_2.cs @@ -0,0 +1,27 @@ +using System; + +public class A +{ + public virtual void SomeMethod() { + Console.WriteLine( "A::SomeMethod" ); + } +} + +public class B : A +{ + public override void SomeMethod() { + Console.WriteLine( "B::SomeMethod" ); + base.SomeMethod(); + } +} + + +public class EntryPoint +{ + static void Main() { + B b = new B(); + A a = b; + + a.SomeMethod(); + } +} diff --git a/4_classes_structs/4_param_array_1.cs b/4_classes_structs/4_param_array_1.cs new file mode 100644 index 0000000..bc96702 --- /dev/null +++ b/4_classes_structs/4_param_array_1.cs @@ -0,0 +1,19 @@ +using System; + +public class EntryPoint +{ + static void Main() { + VarArgs( 42 ); + VarArgs( 42, 43, 44 ); + VarArgs( 44, 56, 23, 234, 45, 123 ); + } + + static void VarArgs( int val1, params int[] vals ) { + Console.WriteLine( "val1: {0}", val1 ); + foreach( int i in vals ) { + Console.WriteLine( "vals[]: {0}", + i ); + } + Console.WriteLine(); + } +} diff --git a/4_classes_structs/4_partial_methods_1a.cs b/4_classes_structs/4_partial_methods_1a.cs new file mode 100644 index 0000000..16bb9ff --- /dev/null +++ b/4_classes_structs/4_partial_methods_1a.cs @@ -0,0 +1,7 @@ +public partial class DataSource +{ + // Some useful methods + // ... + + partial void ResetSource(); +} diff --git a/4_classes_structs/4_partial_methods_1b.cs b/4_classes_structs/4_partial_methods_1b.cs new file mode 100644 index 0000000..e95367c --- /dev/null +++ b/4_classes_structs/4_partial_methods_1b.cs @@ -0,0 +1,21 @@ +using System; + +public partial class DataSource +{ + partial void ResetSource() { + Console.WriteLine( "Source was reset" ); + } + + public void Reset() { + ResetSource(); + } +} + +public class PartialMethods +{ + static void Main() { + DataSource ds = new DataSource(); + + ds.Reset(); + } +} diff --git a/4_classes_structs/4_properties_1.cs b/4_classes_structs/4_properties_1.cs new file mode 100644 index 0000000..f2a80ad --- /dev/null +++ b/4_classes_structs/4_properties_1.cs @@ -0,0 +1,18 @@ +public class A +{ + public static void SomeFunction( ref int i ) + { + i = 4; + } + + static void Main() + { + SomeObject obj = new SomeObject(); + + obj.X = 1; // could be a public field or a property + obj.Y = 2; // could be a public field or a property + + // This is an error if X is a property + // SomeFunction( ref obj.X ); + } +} diff --git a/4_classes_structs/4_properties_2.cs b/4_classes_structs/4_properties_2.cs new file mode 100644 index 0000000..a78c62a --- /dev/null +++ b/4_classes_structs/4_properties_2.cs @@ -0,0 +1,31 @@ +public class A +{ + private int temperature; + + public int Temperature + { + get + { + System.Console.WriteLine( "Getting value for temperature" ); + return temperature; + } + + set + { + System.Console.WriteLine( "Setting value for temperature" ); + temperature = value; + } + } +} + +public class MainClass +{ + static void Main() + { + A obj = new A(); + + obj.Temperature = 1; + System.Console.WriteLine( "obj.Temperature = {0}", + obj.Temperature ); + } +} diff --git a/4_classes_structs/4_properties_3.cs b/4_classes_structs/4_properties_3.cs new file mode 100644 index 0000000..2485cdc --- /dev/null +++ b/4_classes_structs/4_properties_3.cs @@ -0,0 +1,14 @@ +using System; + +public class Employee +{ + public string FullName { get; set; } + public string Id { get; set; } +} + +public class AutoProps +{ + static void Main() { + Employee emp = new Employee(); + } +} diff --git a/4_classes_structs/4_properties_4.cs b/4_classes_structs/4_properties_4.cs new file mode 100644 index 0000000..e9c64f9 --- /dev/null +++ b/4_classes_structs/4_properties_4.cs @@ -0,0 +1,17 @@ +using System; + +public class Employee +{ + public string FullName { get; private set; } + public string Id { get; set; } +} + +public class AutoProps +{ + static void Main() { + Employee emp = new Employee { + FullName = "John Doe", + Id = "111-11-1111" + }; + } +} diff --git a/4_classes_structs/4_readonly_1.cs b/4_classes_structs/4_readonly_1.cs new file mode 100644 index 0000000..e4598b0 --- /dev/null +++ b/4_classes_structs/4_readonly_1.cs @@ -0,0 +1,30 @@ +public class A +{ + public A() + { + this.y = 456; + + // We can even set y again. + this.y = 654; + + // We can use y as a ref param. + SetField( ref this.y ); + } + + private void SetField( ref int val ) + { + val = 888; + } + + private readonly int x = 123; + private readonly int y; + public const int z = 555; + + static void Main() + { + A obj = new A(); + + System.Console.WriteLine( "x = {0}, y = {1}, z = {2}", + obj.x, obj.y, A.z ); + } +} diff --git a/4_classes_structs/4_ref_param_1.cs b/4_classes_structs/4_ref_param_1.cs new file mode 100644 index 0000000..245aabd --- /dev/null +++ b/4_classes_structs/4_ref_param_1.cs @@ -0,0 +1,30 @@ +using System; + +public struct MyStruct +{ + public int val; +} + +public class EntryPoint +{ + static void Main() { + MyStruct myValue = new MyStruct(); + myValue.val = 10; + + PassByValue( myValue ); + Console.WriteLine( "Result of PassByValue: myValue.val = {0}", + myValue.val ); + + PassByRef( ref myValue ); + Console.WriteLine( "Result of PassByRef: myValue.val = {0}", + myValue.val ); + } + + static void PassByValue( MyStruct myValue ) { + myValue.val = 50; + } + + static void PassByRef( ref MyStruct myValue ) { + myValue.val = 42; + } +} diff --git a/4_classes_structs/4_ref_param_2.cs b/4_classes_structs/4_ref_param_2.cs new file mode 100644 index 0000000..97683bc --- /dev/null +++ b/4_classes_structs/4_ref_param_2.cs @@ -0,0 +1,19 @@ +using System; + +public class EntryPoint +{ + static void Main() { + object myObject = new Object(); + + Console.WriteLine( "myObject.GetHashCode() == {0}", + myObject.GetHashCode() ); + PassByRef( ref myObject ); + Console.WriteLine( "myObject.GetHashCode() == {0}", + myObject.GetHashCode() ); + } + + static void PassByRef( ref object myObject ) { + // Assign a new instance to the variable. + myObject = new Object(); + } +} diff --git a/4_classes_structs/4_specialization_1.cs b/4_classes_structs/4_specialization_1.cs new file mode 100644 index 0000000..1248cdd --- /dev/null +++ b/4_classes_structs/4_specialization_1.cs @@ -0,0 +1,40 @@ +public class GeometricShape +{ + public virtual void Draw() + { + // Do some default drawing stuff. + } +} + +public class Rectangle : GeometricShape +{ + public override void Draw() + { + // Draw a rectangle + } +} + +public class Circle : GeometricShape +{ + public override void Draw() + { + // Draw a circle + } +} + +public class EntryPoint +{ + private static void DrawShape( GeometricShape shape ) + { + shape.Draw(); + } + + static void Main() + { + Circle circle = new Circle(); + GeometricShape shape = circle; + + DrawShape( shape ); + DrawShape( circle ); + } +} diff --git a/4_classes_structs/4_static_class_1.cs b/4_classes_structs/4_static_class_1.cs new file mode 100644 index 0000000..79ed9d8 --- /dev/null +++ b/4_classes_structs/4_static_class_1.cs @@ -0,0 +1,38 @@ +using System; + +public static class StaticClass +{ + public static void DoWork() { + ++callCount; + Console.WriteLine( "StaticClass.DoWork()" ); + } + + public class NestedClass { + public NestedClass() { + Console.WriteLine( "NestedClass.NestedClass()" ); + } + } + + private static long callCount = 0; + public static long CallCount { + get { + return callCount; + } + } +} + +public static class EntryPoint +{ + static void Main() { + StaticClass.DoWork(); + + // OOPS! Cannot do this! + // StaticClass obj = new StaticClass(); + + StaticClass.NestedClass nested = + new StaticClass.NestedClass(); + + Console.WriteLine( "CallCount = {0}", + StaticClass.CallCount ); + } +} diff --git a/4_classes_structs/4_static_ctor_1.cs b/4_classes_structs/4_static_ctor_1.cs new file mode 100644 index 0000000..bd8a4fd --- /dev/null +++ b/4_classes_structs/4_static_ctor_1.cs @@ -0,0 +1,44 @@ +using System; + +public class A +{ + static A() + { + Console.WriteLine( "static A::A()" ); + } + + private static int InitX() + { + Console.WriteLine( "A.InitX()" ); + return 1; + } + private static int InitY() + { + Console.WriteLine( "A.InitY()" ); + return 2; + } + private static int InitA() + { + Console.WriteLine( "A.InitA()" ); + return 3; + } + private static int InitB() + { + Console.WriteLine( "A.InitB()" ); + return 4; + } + + private int y = InitY(); + private int x = InitX(); + + private static int a = InitA(); + private static int b = InitB(); +} + +public class EntryPoint +{ + static void Main() + { + A a = new A(); + } +} diff --git a/4_classes_structs/4_static_field_example_1.cs b/4_classes_structs/4_static_field_example_1.cs new file mode 100644 index 0000000..fe733ef --- /dev/null +++ b/4_classes_structs/4_static_field_example_1.cs @@ -0,0 +1,33 @@ +public class Employee +{ + public Employee() + { + // Set the static field to something. + totalHeadCount = 123; + + // The following is a compiler error !! + // this.totalHeadCount = 123; + + // Set the static field to something else. + Employee.totalHeadCount = 456; + } + + public static int totalHeadCount; +} + +public class EntryPoint +{ + static void Main() + { + Employee bob = new Employee(); + + System.Console.WriteLine( + "Static Field Employee.totalHeadCount is {0}", + Employee.totalHeadCount ); + + // The following is a compile error !! + // System.Console.WriteLine( + // "Static Field Employee.totalHeadCount is {0}", + // bob.totalHeadCount ); + } +} diff --git a/4_classes_structs/4_static_method_1.cs b/4_classes_structs/4_static_method_1.cs new file mode 100644 index 0000000..162c60d --- /dev/null +++ b/4_classes_structs/4_static_method_1.cs @@ -0,0 +1,13 @@ +public class A +{ + public static void SomeFunction() + { + System.Console.WriteLine( "SomeFunction() called" ); + } + + static void Main() + { + A.SomeFunction(); + SomeFunction(); + } +} diff --git a/4_classes_structs/4_struct_this_1.cs b/4_classes_structs/4_struct_this_1.cs new file mode 100644 index 0000000..cd65913 --- /dev/null +++ b/4_classes_structs/4_struct_this_1.cs @@ -0,0 +1,25 @@ +public struct ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public ComplexNumber( ComplexNumber other ) + { + this = other; + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() + { + ComplexNumber valA = new ComplexNumber( 1, 2 ); + ComplexNumber copyA = new ComplexNumber( valA ); + } +} diff --git a/4_classes_structs/4_struct_this_2.cs b/4_classes_structs/4_struct_this_2.cs new file mode 100644 index 0000000..a5f5783 --- /dev/null +++ b/4_classes_structs/4_struct_this_2.cs @@ -0,0 +1,16 @@ +public struct ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public ComplexNumber( double real ) + { + this.real = real; + } + + private double real; + private double imaginary; +} diff --git a/4_classes_structs/4_struct_this_3.cs b/4_classes_structs/4_struct_this_3.cs new file mode 100644 index 0000000..0e6348e --- /dev/null +++ b/4_classes_structs/4_struct_this_3.cs @@ -0,0 +1,25 @@ +public struct ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public ComplexNumber( double real ) + :this( real, 0 ) + { + this.real = real; + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() + { + ComplexNumber valA = new ComplexNumber( 1, 2 ); + } +} diff --git a/4_classes_structs/4_struct_this_4.cs b/4_classes_structs/4_struct_this_4.cs new file mode 100644 index 0000000..ab8601a --- /dev/null +++ b/4_classes_structs/4_struct_this_4.cs @@ -0,0 +1,17 @@ +public struct ComplexNumber +{ + public ComplexNumber( double real, double imaginary ) + { + this.real = real; + this.imaginary = imaginary; + } + + public ComplexNumber( double real ) + :this() + { + this.real = real; + } + + private double real; + private double imaginary; +} diff --git a/4_classes_structs/4_types_vs_class.cs b/4_classes_structs/4_types_vs_class.cs new file mode 100644 index 0000000..38f8650 --- /dev/null +++ b/4_classes_structs/4_types_vs_class.cs @@ -0,0 +1,28 @@ +interface IKnowsIcelandic +{ +} + +class Dog : IKnowsIcelandic +{ +} + +class Human : IKnowsIcelandic +{ +} + +class LanguagesAreFun +{ + static void ListenToMe( IKnowsIcelandic listener ) + { + } + + static void Main() + { + Dog dog = new Dog(); + Human human = new Human(); + + ListenToMe( dog ); + ListenToMe( human ); + } +} + diff --git a/4_classes_structs/anonymous_types_1.cs b/4_classes_structs/anonymous_types_1.cs new file mode 100644 index 0000000..65bdb96 --- /dev/null +++ b/4_classes_structs/anonymous_types_1.cs @@ -0,0 +1,18 @@ +using System; + +public class EntryPoint +{ + static void Main() { + var employeeInfo = new { Name = "Joe", Id = 42 }; + var customerInfo = new { Name = "Jane", Id = "AB123" }; + + Console.WriteLine( "Name: {0}, Id: {1}", + employeeInfo.Name, + employeeInfo.Id ); + + Console.WriteLine( "employeeInfo Type is actually: {0}", + employeeInfo.GetType() ); + Console.WriteLine( "customerInfo Type is actually: {0}", + customerInfo.GetType() ); + } +} diff --git a/4_classes_structs/anonymous_types_2.cs b/4_classes_structs/anonymous_types_2.cs new file mode 100644 index 0000000..0fe4b79 --- /dev/null +++ b/4_classes_structs/anonymous_types_2.cs @@ -0,0 +1,58 @@ +using System; + +public class ConventionalEmployeeInfo +{ + public ConventionalEmployeeInfo( string Name, int Id ) { + this.name = Name; + this.id = Id; + } + + public string Name { + get { + return name; + } + + set { + name = value; + } + } + + public int Id { + get { + return id; + } + + set { + id = value; + } + } + + private string name; + private int id; +} + +public class EntryPoint +{ + static void Main() { + ConventionalEmployeeInfo oldEmployee = + new ConventionalEmployeeInfo( "Joe", 42 ); + + var employeeInfo = new { oldEmployee.Name, + oldEmployee.Id }; + + string Name = "Jane"; + int Id = 1234; + + var customerInfo = new { Name, Id }; + + Console.WriteLine( "employeeInfo Name: {0}, Id: {1}", + employeeInfo.Name, + employeeInfo.Id ); + Console.WriteLine( "customerInfo Name: {0}, Id: {1}", + customerInfo.Name, + customerInfo.Id ); + + Console.WriteLine( "Anonymous Type is actually: {0}", + employeeInfo.GetType() ); + } +} diff --git a/4_classes_structs/obj_initializer_1.cs b/4_classes_structs/obj_initializer_1.cs new file mode 100644 index 0000000..145ddb0 --- /dev/null +++ b/4_classes_structs/obj_initializer_1.cs @@ -0,0 +1,22 @@ +using System; + +public class Employee +{ + public string Name { + get; set; + } + + public string OfficeLocation { + get; set; + } +} + +public class InitExample +{ + static void Main() { + Employee developer = new Employee { + Name = "Fred Blaze", + OfficeLocation = "B1" + }; + } +} diff --git a/4_classes_structs/obj_initializer_2.cs b/4_classes_structs/obj_initializer_2.cs new file mode 100644 index 0000000..889ec6d --- /dev/null +++ b/4_classes_structs/obj_initializer_2.cs @@ -0,0 +1,29 @@ +using System; + +public class Employee +{ + public string Name { get; set; } + public string OfficeLocation { get; set; } +} + +public class FeatureDevPair +{ + public Employee Developer { get; set; } + public Employee QaEngineer { get; set; } +} + +public class InitExample +{ + static void Main() { + FeatureDevPair spellCheckerTeam = new FeatureDevPair { + Developer = new Employee { + Name = "Fred Blaze", + OfficeLocation = "B1" + }, + QaEngineer = new Employee { + Name = "Marisa Bozza", + OfficeLocation = "L42" + } + }; + } +} diff --git a/4_classes_structs/obj_initializer_3.cs b/4_classes_structs/obj_initializer_3.cs new file mode 100644 index 0000000..ee0bdc8 --- /dev/null +++ b/4_classes_structs/obj_initializer_3.cs @@ -0,0 +1,39 @@ +using System; + +public class Employee +{ + public string Name { get; set; } + public string OfficeLocation { get; set; } +} + +public class FeatureDevPair +{ + private Employee developer = new Employee(); + private Employee qaEngineer = new Employee(); + + public Employee Developer { + get { return developer; } + set { developer = value; } + } + + public Employee QaEngineer { + get { return qaEngineer; } + set { qaEngineer = value; } + } +} + +public class InitExample +{ + static void Main() { + FeatureDevPair spellCheckerTeam = new FeatureDevPair { + Developer = { + Name = "Fred Blaze", + OfficeLocation = "B1" + }, + QaEngineer = { + Name = "Marisa Bozza", + OfficeLocation = "L42" + } + }; + } +} diff --git a/5_interfaces/abstract_1.cs b/5_interfaces/abstract_1.cs new file mode 100644 index 0000000..d24aafc --- /dev/null +++ b/5_interfaces/abstract_1.cs @@ -0,0 +1,21 @@ +public abstract class MyOperations +{ + public virtual void Operation1() { + } + + public virtual void Operation2() { + } +} + +// Client class +public class ClientClass : MyOperations +{ + public override void Operation1() { } + public override void Operation2() { } +} + +public class AnotherClass +{ + public void DoWork( MyOperations ops ) { + } +} diff --git a/5_interfaces/abstract_2.cs b/5_interfaces/abstract_2.cs new file mode 100644 index 0000000..20ac262 --- /dev/null +++ b/5_interfaces/abstract_2.cs @@ -0,0 +1,26 @@ +public abstract class MyOperations +{ + public virtual void Operation1() { + } + + public virtual void Operation2() { + } + + public virtual void Operation3() { + // New default implementation + } +} + +// Client class +public class ClientClass : MyOperations +{ + public override void Operation1() { } + public override void Operation2() { } +} + +public class AnotherClass +{ + public void DoWork( MyOperations ops ) { + ops.Operation3(); + } +} diff --git a/5_interfaces/crazy_1.cs b/5_interfaces/crazy_1.cs new file mode 100644 index 0000000..0cdaa0f --- /dev/null +++ b/5_interfaces/crazy_1.cs @@ -0,0 +1,39 @@ +using System; + +public interface I +{ + void Go(); +} + +public class A : I +{ + public void Go() { + Console.WriteLine( "A.Go()" ); + } +} + +public class B : A +{ +} + +public class C : B, I +{ + public new void Go() { + Console.WriteLine( "C.Go()" ); + } +} + +public class EntryPoint +{ + static void Main() { + B b1 = new B(); + + C c1 = new C(); + B b2 = c1; + + b1.Go(); + c1.Go(); + b2.Go(); + ((I)b2).Go(); + } +} diff --git a/5_interfaces/diamond_1.cs b/5_interfaces/diamond_1.cs new file mode 100644 index 0000000..ec21180 --- /dev/null +++ b/5_interfaces/diamond_1.cs @@ -0,0 +1,19 @@ +public interface IUIControl +{ + void Paint(); +} + +public interface IEditBox : IUIControl +{ +} + +public interface IDropList : IUIControl +{ +} + +public class ComboBox : IEditBox, IDropList +{ + public void Paint() { + // paint implementation for ComboBox + } +} diff --git a/5_interfaces/diamond_2.cs b/5_interfaces/diamond_2.cs new file mode 100644 index 0000000..5809f6d --- /dev/null +++ b/5_interfaces/diamond_2.cs @@ -0,0 +1,33 @@ +using System; + +public interface IUIControl +{ + void Paint(); +} + +public interface IEditBox : IUIControl +{ + new void Paint(); +} + +public interface IDropList : IUIControl +{ +} + +public class ComboBox : IEditBox, IDropList +{ + public void Paint() { + Console.WriteLine( "ComboBox.IEditBox.Paint()" ); + } +} + +public class EntryPoint +{ + static void Main() { + ComboBox cb = new ComboBox(); + cb.Paint(); + ((IEditBox)cb).Paint(); + ((IDropList)cb).Paint(); + ((IUIControl)cb).Paint(); + } +} diff --git a/5_interfaces/diamond_3.cs b/5_interfaces/diamond_3.cs new file mode 100644 index 0000000..434827e --- /dev/null +++ b/5_interfaces/diamond_3.cs @@ -0,0 +1,41 @@ +using System; + +public interface IUIControl +{ + void Paint(); +} + +public interface IEditBox : IUIControl +{ + new void Paint(); +} + +public interface IDropList : IUIControl +{ +} + +public class ComboBox : IEditBox, IDropList +{ + void IEditBox.Paint() { + Console.WriteLine( "ComboBox.IEditBox.Paint()" ); + } + + void IUIControl.Paint() { + Console.WriteLine( "ComboBox.IUIControl.Paint()" ); + } + + public void Paint() { + ((IUIControl)this).Paint(); + } +} + +public class EntryPoint +{ + static void Main() { + ComboBox cb = new ComboBox(); + cb.Paint(); + ((IEditBox)cb).Paint(); + ((IDropList)cb).Paint(); + ((IUIControl)cb).Paint(); + } +} diff --git a/5_interfaces/diamond_4.cs b/5_interfaces/diamond_4.cs new file mode 100644 index 0000000..fddb2f4 --- /dev/null +++ b/5_interfaces/diamond_4.cs @@ -0,0 +1,39 @@ +using System; + +public interface IUIControl +{ + void Paint(); + void Show(); +} + +public interface IEditBox : IUIControl +{ + void SelectText(); +} + +public interface IDropList : IUIControl +{ + void ShowList(); +} + +public class ComboBox : IEditBox, IDropList +{ + public void Paint() { } + public void Show() { } + + public void SelectText() { } + + public void ShowList() { } +} + +public class FancyComboBox : ComboBox +{ + public void Paint() { } +} + +public class EntryPoint +{ + static void Main() { + FancyComboBox cb = new FancyComboBox(); + } +} diff --git a/5_interfaces/diamond_5.cs b/5_interfaces/diamond_5.cs new file mode 100644 index 0000000..d3502cb --- /dev/null +++ b/5_interfaces/diamond_5.cs @@ -0,0 +1,46 @@ +using System; + +public interface IUIControl +{ + void Paint(); + void Show(); +} + +public interface IEditBox : IUIControl +{ + void SelectText(); +} + +public interface IDropList : IUIControl +{ + void ShowList(); +} + +public class ComboBox : IEditBox, IDropList +{ + public void Paint() { + Console.WriteLine( "ComboBox.Paint()" ); + } + public void Show() { } + + public void SelectText() { } + + public void ShowList() { } +} + +public class FancyComboBox : ComboBox, IUIControl +{ + public new void Paint() { + Console.WriteLine( "FancyComboBox.Paint()" ); + } +} + +public class EntryPoint +{ + static void Main() { + FancyComboBox cb = new FancyComboBox(); + cb.Paint(); + ((IUIControl)cb).Paint(); + ((IEditBox)cb).Paint(); + } +} diff --git a/5_interfaces/diamond_6.cs b/5_interfaces/diamond_6.cs new file mode 100644 index 0000000..f684c0c --- /dev/null +++ b/5_interfaces/diamond_6.cs @@ -0,0 +1,46 @@ +using System; + +public interface IUIControl +{ + void Paint(); + void Show(); +} + +public interface IEditBox : IUIControl +{ + void SelectText(); +} + +public interface IDropList : IUIControl +{ + void ShowList(); +} + +public class ComboBox : IEditBox, IDropList +{ + public virtual void Paint() { + Console.WriteLine( "ComboBox.Paint()" ); + } + public void Show() { } + + public void SelectText() { } + + public void ShowList() { } +} + +public class FancyComboBox : ComboBox +{ + public override void Paint() { + Console.WriteLine( "FancyComboBox.Paint()" ); + } +} + +public class EntryPoint +{ + static void Main() { + FancyComboBox cb = new FancyComboBox(); + cb.Paint(); + ((IUIControl)cb).Paint(); + ((IEditBox)cb).Paint(); + } +} diff --git a/5_interfaces/iface_1.cs b/5_interfaces/iface_1.cs new file mode 100644 index 0000000..4e715d0 --- /dev/null +++ b/5_interfaces/iface_1.cs @@ -0,0 +1,12 @@ +public interface IMyOperations +{ + void Operation1(); + void Operation2(); +} + +// Client class +public class ClientClass : IMyOperations +{ + public void Operation1() { } + public void Operation2() { } +} diff --git a/5_interfaces/iface_2.cs b/5_interfaces/iface_2.cs new file mode 100644 index 0000000..489499e --- /dev/null +++ b/5_interfaces/iface_2.cs @@ -0,0 +1,27 @@ +public interface IMyOperations +{ + void Operation1(); + void Operation2(); +} + +public interface IMyOperations2 +{ + void Operation1(); + void Operation2(); + void Operation3(); +} + +// Client class +public class ClientClass : IMyOperations, + IMyOperations2 +{ + public void Operation1() { } + public void Operation2() { } + public void Operation3() { } +} + +public class AnotherClass +{ + public void DoWork( IMyOperations ops ) { + } +} diff --git a/5_interfaces/method_search_1.cs b/5_interfaces/method_search_1.cs new file mode 100644 index 0000000..1d88cb4 --- /dev/null +++ b/5_interfaces/method_search_1.cs @@ -0,0 +1,46 @@ +using System; + +public interface ISomeInterface +{ + void SomeMethod(); +} + +public interface IAnotherInterface : ISomeInterface +{ + void AnotherMethod(); +} + +public class SomeClass : IAnotherInterface +{ + public void SomeMethod() { + Console.WriteLine( "SomeClass.SomeMethod()" ); + } + + public virtual void AnotherMethod() { + Console.WriteLine( "SomeClass.AnotherMethod()" ); + } +} + +public class SomeDerivedClass : SomeClass +{ + public new void SomeMethod() { + Console.WriteLine( "SomeDerivedClass.SomeMethod()" ); + } + + public override void AnotherMethod() { + Console.WriteLine( "SomeDerivedClass.AnotherMethod()" ); + } +} + +public class EntryPoint +{ + static void Main() { + SomeDerivedClass obj = new SomeDerivedClass(); + ISomeInterface isi = obj; + IAnotherInterface iai = obj; + + isi.SomeMethod(); + iai.SomeMethod(); + iai.AnotherMethod(); + } +} diff --git a/5_interfaces/value_type_1.cs b/5_interfaces/value_type_1.cs new file mode 100644 index 0000000..f045522 --- /dev/null +++ b/5_interfaces/value_type_1.cs @@ -0,0 +1,30 @@ +using System; + +public struct SomeValue : IComparable +{ + public SomeValue( int n ) { + this.n = n; + } + + public int CompareTo( object obj ) { + if( obj is SomeValue ) { + SomeValue other = (SomeValue) obj; + + return n - other.n; + } else { + throw new ArgumentException( "Wrong Type!" ); + } + } + + private int n; +} + +public class EntryPoint +{ + static void Main() { + SomeValue val1 = new SomeValue( 1 ); + SomeValue val2 = new SomeValue( 2 ); + + Console.WriteLine( val1.CompareTo(val2) ); + } +} diff --git a/5_interfaces/value_type_2.cs b/5_interfaces/value_type_2.cs new file mode 100644 index 0000000..f850e9e --- /dev/null +++ b/5_interfaces/value_type_2.cs @@ -0,0 +1,34 @@ +using System; + +public struct SomeValue : IComparable +{ + public SomeValue( int n ) { + this.n = n; + } + + int IComparable.CompareTo( object obj ) { + if( obj is SomeValue ) { + SomeValue other = (SomeValue) obj; + + return n - other.n; + } else { + throw new ArgumentException( "Wrong Type!" ); + } + } + + public int CompareTo( SomeValue other ) { + return n - other.n; + } + + private int n; +} + +public class EntryPoint +{ + static void Main() { + SomeValue val1 = new SomeValue( 1 ); + SomeValue val2 = new SomeValue( 2 ); + + Console.WriteLine( val1.CompareTo(val2) ); + } +} diff --git a/5_interfaces/zoo_1.cs b/5_interfaces/zoo_1.cs new file mode 100644 index 0000000..efb6f52 --- /dev/null +++ b/5_interfaces/zoo_1.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.ObjectModel; + +namespace CityOfShanoo.MyZoo +{ + +public struct Point +{ + public double X; + public double Y; +} + +public abstract class ZooDweller +{ + public void EatSomeFood() { + DoEatTheFood(); + } + + protected abstract void DoEatTheFood(); +} + +public sealed class ZooKeeper +{ + public void SendFlyCommand( Point to ) { + // Implementation removed for clarity. + } +} + +public sealed class Zoo +{ + private static Zoo theInstance = new Zoo(); + public static Zoo GetInstance() { + return theInstance; + } + + private Zoo() { + creatures = new Collection(); + zooKeeper = new ZooKeeper(); + } + + public ZooKeeper ZooKeeper { + get { + return zooKeeper; + } + } + + private ZooKeeper zooKeeper; + private Collection creatures; +} + +} diff --git a/5_interfaces/zoo_2.cs b/5_interfaces/zoo_2.cs new file mode 100644 index 0000000..c4abe97 --- /dev/null +++ b/5_interfaces/zoo_2.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.ObjectModel; + +namespace CityOfShanoo.MyZoo +{ + +public struct Point +{ + public double x; + public double y; +} + +public interface IFly +{ + void FlyTo( Point destination ); +} + +public abstract class ZooDweller +{ + public void EatSomeFood() { + DoEatTheFood(); + } + + protected abstract void DoEatTheFood(); +} + +public class Bird : ZooDweller, IFly +{ + public void FlyTo( Point destination ) { + Console.WriteLine( "Flying to ({0}. {1}).", + destination ); + } + + protected override void DoEatTheFood() { + Console.WriteLine( "Eating some food." ); + } +} + +public sealed class ZooKeeper +{ + public void SendFlyCommand( Point to ) { + } +} + +public sealed class Zoo +{ + private static Zoo theInstance = new Zoo(); + public static Zoo GetInstance() { + return theInstance; + } + + private Zoo() { + creatures = new Collection(); + zooKeeper = new ZooKeeper(); + } + + public ZooKeeper ZooKeeper { + get { + return zooKeeper; + } + } + + private ZooKeeper zooKeeper; + private Collection creatures; +} + +} diff --git a/6_operators/6_complex_1.cs b/6_operators/6_complex_1.cs new file mode 100644 index 0000000..a60bfef --- /dev/null +++ b/6_operators/6_complex_1.cs @@ -0,0 +1,64 @@ +using System; + +public struct Complex +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + static public Complex Add( Complex lhs, + Complex rhs ) { + return new Complex( lhs.real + rhs.real, + lhs.imaginary + rhs.imaginary ); + } + + static public Complex Add( Complex lhs, + double rhs ) { + + return new Complex( rhs + lhs.real, + lhs.imaginary ); + } + + public override string ToString() { + return String.Format( "({0}, {1})", + real, + imaginary ); + } + + static public Complex operator+( Complex lhs, + Complex rhs ) { + return Add( lhs, rhs ); + } + + static public Complex operator+( double lhs, + Complex rhs ) { + return Add( rhs, lhs ); + } + + static public Complex operator+( Complex lhs, + double rhs ) { + return Add( lhs, rhs ); + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex cpx1 = new Complex( 1.0, 3.0 ); + Complex cpx2 = new Complex( 1.0, 2.0 ); + + Complex cpx3 = cpx1 + cpx2; + Complex cpx4 = 20.0 + cpx1; + Complex cpx5 = cpx1 + 25.0; + + Console.WriteLine( "cpx1 == {0}", cpx1 ); + Console.WriteLine( "cpx2 == {0}", cpx2 ); + Console.WriteLine( "cpx3 == {0}", cpx3 ); + Console.WriteLine( "cpx4 == {0}", cpx4 ); + Console.WriteLine( "cpx5 == {0}", cpx5 ); + } +} diff --git a/6_operators/6_complex_2.cs b/6_operators/6_complex_2.cs new file mode 100644 index 0000000..f147ef6 --- /dev/null +++ b/6_operators/6_complex_2.cs @@ -0,0 +1,117 @@ +using System; + +public struct Complex : IComparable, + IEquatable, + IComparable +{ + public Complex( double real, double img ) { + this.real = real; + this.img = img; + } + + // System.Object override + public override bool Equals( object other ) { + bool result = false; + if( other is Complex ) { + result = Equals( (Complex) other ); + } + return result; + } + + // Typesafe version + public bool Equals( Complex that ) { + return (this.real == that.real && + this.img == that.img); + } + + // Must override this if overriding Object.Equals() + public override int GetHashCode() { + return (int) this.Magnitude; + } + + // Typesafe version + public int CompareTo( Complex that ) { + int result; + if( Equals( that ) ) { + result = 0; + } else if( this.Magnitude > that.Magnitude ) { + result = 1; + } else { + result = -1; + } + + return result; + } + + // IComparable implementation + int IComparable.CompareTo( object other ) { + if( !(other is Complex) ) { + throw new ArgumentException( "Bad Comparison" ); + } + + return CompareTo( (Complex) other ); + } + + // System.Object override + public override string ToString() { + return String.Format( "({0}, {1})", + real, + img ); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.img, 2) ); + } + } + + // Overloaded operators + public static bool operator==( Complex lhs, Complex rhs ) { + return lhs.Equals( rhs ); + } + + public static bool operator!=( Complex lhs, Complex rhs ) { + return !lhs.Equals( rhs ); + } + + public static bool operator<( Complex lhs, Complex rhs ) { + return lhs.CompareTo( rhs ) < 0; + } + + public static bool operator>( Complex lhs, Complex rhs ) { + return lhs.CompareTo( rhs ) > 0; + } + + public static bool operator<=( Complex lhs, Complex rhs ) { + return lhs.CompareTo( rhs ) <= 0; + } + + public static bool operator>=( Complex lhs, Complex rhs ) { + return lhs.CompareTo( rhs ) >= 0; + } + + // Other methods ommitted for clarity. + + private double real; + private double img; +} + +public class EntryPoint +{ + static void Main() { + Complex cpx1 = new Complex( 1.0, 3.0 ); + Complex cpx2 = new Complex( 1.0, 2.0 ); + + Console.WriteLine( "cpx1 = {0}, cpx1.Magnitude = {1}", + cpx1, cpx1.Magnitude ); + Console.WriteLine( "cpx2 = {0}, cpx2.Magnitude = {1}\n", + cpx2, cpx2.Magnitude ); + Console.WriteLine( "cpx1 == cpx2 ? {0}", cpx1 == cpx2 ); + Console.WriteLine( "cpx1 != cpx2 ? {0}", cpx1 != cpx2 ); + Console.WriteLine( "cpx1 < cpx2 ? {0}", cpx1 < cpx2 ); + Console.WriteLine( "cpx1 > cpx2 ? {0}", cpx1 > cpx2 ); + Console.WriteLine( "cpx1 <= cpx2 ? {0}", cpx1 <= cpx2 ); + Console.WriteLine( "cpx1 >= cpx2 ? {0}", cpx1 >= cpx2 ); + } +} diff --git a/6_operators/6_complex_3.cs b/6_operators/6_complex_3.cs new file mode 100644 index 0000000..27af903 --- /dev/null +++ b/6_operators/6_complex_3.cs @@ -0,0 +1,48 @@ +using System; + +public struct Complex +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + // System.Object override + public override string ToString() { + return String.Format( "({0}, {1})", real, imaginary ); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + public static implicit operator Complex( double d ) { + return new Complex( d, 0 ); + } + + public static explicit operator double( Complex c ) { + return c.Magnitude; + } + + // Other methods ommitted for clarity. + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex cpx1 = new Complex( 1.0, 3.0 ); + Complex cpx2 = 2.0; // Use implicit operator. + + double d = (double) cpx1; // Use explicit operator. + + Console.WriteLine( "cpx1 = {0}", cpx1 ); + Console.WriteLine( "cpx2 = {0}", cpx2 ); + Console.WriteLine( "d = {0}", d ); + } +} diff --git a/6_operators/6_complex_4.cs b/6_operators/6_complex_4.cs new file mode 100644 index 0000000..c689c2b --- /dev/null +++ b/6_operators/6_complex_4.cs @@ -0,0 +1,51 @@ +using System; + +public struct Complex +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + // System.Object override + public override string ToString() { + return String.Format( "({0}, {1})", + real, + imaginary ); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + public static bool operator true( Complex c ) { + return (c.real != 0) || (c.imaginary != 0); + } + + public static bool operator false( Complex c ) { + return (c.real == 0) && (c.imaginary == 0); + } + + // Other methods ommitted for clarity. + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex cpx1 = new Complex( 1.0, 3.0 ); + if( cpx1 ) { + Console.WriteLine( "cpx1 is true" ); + } else { + Console.WriteLine( "cpx1 is false" ); + } + + Complex cpx2 = new Complex( 0, 0 ); + Console.WriteLine( "cpx2 is {0}", cpx2 ? "true" : "false" ); + } +} diff --git a/6_operators/6_complex_5.cs b/6_operators/6_complex_5.cs new file mode 100644 index 0000000..06221cb --- /dev/null +++ b/6_operators/6_complex_5.cs @@ -0,0 +1,47 @@ +using System; + +public struct Complex +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + // System.Object override + public override string ToString() { + return String.Format( "({0}, {1})", + real, + imaginary ); + } + + public double Magnitude { + get { + return Math.Sqrt( Math.Pow(this.real, 2) + + Math.Pow(this.imaginary, 2) ); + } + } + + public static implicit operator bool( Complex c ) { + return (c.real != 0) || (c.imaginary != 0); + } + + // Other methods ommitted for clarity. + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + Complex cpx1 = new Complex( 1.0, 3.0 ); + if( cpx1 ) { + Console.WriteLine( "cpx1 is true" ); + } else { + Console.WriteLine( "cpx1 is false" ); + } + + Complex cpx2 = new Complex( 0, 0 ); + Console.WriteLine( "cpx2 is {0}", cpx2 ? "true" : "false" ); + } +} diff --git a/6_operators/6_invalid_use_1.cs b/6_operators/6_invalid_use_1.cs new file mode 100644 index 0000000..7612e79 --- /dev/null +++ b/6_operators/6_invalid_use_1.cs @@ -0,0 +1,17 @@ +public class Apple +{ + public static Apple operator+( Apple rhs, Apple lhs ) { + // Method does nothing and exists only for example. + return rhs; + } +} + +public class GreenApple : Apple +{ + // INVALID!! -- Won't compile. + public static Apple operator+( Apple rhs, Apple lhs ) { + // Method does nothing and exists only for example. + return rhs; + } +} + diff --git a/7_exception_safety/7_employee_database_1.cs b/7_exception_safety/7_employee_database_1.cs new file mode 100644 index 0000000..d68797b --- /dev/null +++ b/7_exception_safety/7_employee_database_1.cs @@ -0,0 +1,7 @@ +using System.Collections; + +class EmployeeDatabase +{ + private ArrayList activeEmployees; + private ArrayList terminatedEmployees; +} diff --git a/7_exception_safety/7_employee_database_2.cs b/7_exception_safety/7_employee_database_2.cs new file mode 100644 index 0000000..1fec454 --- /dev/null +++ b/7_exception_safety/7_employee_database_2.cs @@ -0,0 +1,17 @@ +using System.Collections; + +class Employee +{ +} + +class EmployeeDatabase +{ + public void TerminateEmployee( int index ) { + object employee = activeEmployees[index]; + activeEmployees.RemoveAt( index ); + terminatedEmployees.Add( employee ); + } + + private ArrayList activeEmployees; + private ArrayList terminatedEmployees; +} diff --git a/7_exception_safety/7_employee_database_3.cs b/7_exception_safety/7_employee_database_3.cs new file mode 100644 index 0000000..3d0633b --- /dev/null +++ b/7_exception_safety/7_employee_database_3.cs @@ -0,0 +1,33 @@ +using System.Collections; + +class Employee +{ +} + +class EmployeeDatabase +{ + public void TerminateEmployee( int index ) { + object employee = null; + try { + employee = activeEmployees[index]; + } + catch { + // oops! We must be out of range here. + } + + if( employee != null ) { + activeEmployees.RemoveAt( index ); + + try { + terminatedEmployees.Add( employee ); + } + catch { + // oops! Allocation may have failed. + activeEmployees.Add( employee ); + } + } + } + + private ArrayList activeEmployees; + private ArrayList terminatedEmployees; +} diff --git a/7_exception_safety/7_employee_database_4.cs b/7_exception_safety/7_employee_database_4.cs new file mode 100644 index 0000000..6c74095 --- /dev/null +++ b/7_exception_safety/7_employee_database_4.cs @@ -0,0 +1,42 @@ +using System.Collections; + +class Employee +{ +} + +class EmployeeDatabase +{ + public void TerminateEmployee( int index ) { + // Clone sensitive objects. + ArrayList tempActiveEmployees = + (ArrayList) activeEmployees.Clone(); + ArrayList tempTerminatedEmployees = + (ArrayList) terminatedEmployees.Clone(); + + // Perform actions on temp objects. + object employee = tempActiveEmployees[index]; + tempActiveEmployees.RemoveAt( index ); + tempTerminatedEmployees.Add( employee ); + + // Now commit the changes. + ArrayList tempSpace = null; + ListSwap( ref activeEmployees, + ref tempActiveEmployees, + ref tempSpace ); + ListSwap( ref terminatedEmployees, + ref tempTerminatedEmployees, + ref tempSpace ); + } + + void ListSwap( ref ArrayList first, + ref ArrayList second, + ref ArrayList temp ) { + temp = first; + first = second; + second = temp; + temp = null; + } + + private ArrayList activeEmployees; + private ArrayList terminatedEmployees; +} diff --git a/7_exception_safety/7_employee_database_4a.cs b/7_exception_safety/7_employee_database_4a.cs new file mode 100644 index 0000000..5f04736 --- /dev/null +++ b/7_exception_safety/7_employee_database_4a.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Runtime.CompilerServices; +using System.Runtime.ConstrainedExecution; + +class Employee +{ +} + +class EmployeeDatabase +{ + public void TerminateEmployee( int index ) { + // Clone sensitive objects. + ArrayList tempActiveEmployees = + (ArrayList) activeEmployees.Clone(); + ArrayList tempTerminatedEmployees = + (ArrayList) terminatedEmployees.Clone(); + + // Perform actions on temp objects. + object employee = tempActiveEmployees[index]; + tempActiveEmployees.RemoveAt( index ); + tempTerminatedEmployees.Add( employee ); + + RuntimeHelpers.PrepareConstrainedRegions(); + try {} finally { + // Now commit the changes. + ArrayList tempSpace = null; + ListSwap( ref activeEmployees, + ref tempActiveEmployees, + ref tempSpace ); + ListSwap( ref terminatedEmployees, + ref tempTerminatedEmployees, + ref tempSpace ); + } + } + + [ReliabilityContract( Consistency.WillNotCorruptState, + Cer.Success )] + void ListSwap( ref ArrayList first, + ref ArrayList second, + ref ArrayList temp ) { + temp = first; + first = second; + second = temp; + temp = null; + } + + private ArrayList activeEmployees; + private ArrayList terminatedEmployees; +} diff --git a/7_exception_safety/7_employee_database_5.cs b/7_exception_safety/7_employee_database_5.cs new file mode 100644 index 0000000..aeb0918 --- /dev/null +++ b/7_exception_safety/7_employee_database_5.cs @@ -0,0 +1,41 @@ +using System; +using System.Runtime.Serialization; + +[Serializable()] +public class EmployeeVerificationException : Exception +{ + public enum Cause { + InvalidSSN, + InvalidBirthDate + } + + public EmployeeVerificationException( Cause reason ) + :base() { + this.reason = reason; + } + + public EmployeeVerificationException( Cause reason, + String msg ) + :base( msg ) { + this.reason = reason; + } + + public EmployeeVerificationException( Cause reason, + String msg, + Exception inner ) + :base( msg, inner ) { + this.reason = reason; + } + + protected EmployeeVerificationException( + SerializationInfo info, + StreamingContext context ) + :base( info, context ) { } + + private Cause reason; + public Cause Reason { + get { + return reason; + } + } +} diff --git a/7_exception_safety/7_exception_syntax_1.cs b/7_exception_safety/7_exception_syntax_1.cs new file mode 100644 index 0000000..c05cec4 --- /dev/null +++ b/7_exception_safety/7_exception_syntax_1.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections; +using System.Runtime.CompilerServices; + +// Disable compiler warning: CS1058 +[assembly: RuntimeCompatibility(WrapNonExceptionThrows = false)] + +public class Entrypoint +{ + static void Main() { + try { + ArrayList list = new ArrayList(); + list.Add( 1 ); + + Console.WriteLine( "Item 10 = {0}", list[10] ); + } + catch( ArgumentOutOfRangeException x ) { + Console.WriteLine( "=== ArgumentOutOfRangeException"+ + " Handler ===" ); + Console.WriteLine( x ); + Console.WriteLine( "=== ArgumentOutOfRangeException"+ + " Handler ===\n\n" ); + } + catch( Exception x ) { + Console.WriteLine( "=== Exception Handler ===" ); + Console.WriteLine( x ); + Console.WriteLine( "=== Exception Handler ===\n\n" ); + } + catch { + Console.WriteLine( "=== Unexpected Exception" + + " Handler ===" ); + Console.WriteLine( "An exception I was not" + + " expecting..." ); + Console.WriteLine( "=== Unexpected Exception" + + " Handler ===" ); + } + finally { + Console.WriteLine( "Cleaning up..." ); + } + } +} diff --git a/7_exception_safety/7_exception_syntax_2.cs b/7_exception_safety/7_exception_syntax_2.cs new file mode 100644 index 0000000..3327cbc --- /dev/null +++ b/7_exception_safety/7_exception_syntax_2.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections; + +public class Entrypoint +{ + static void Main() { + try { + try { + ArrayList list = new ArrayList(); + list.Add( 1 ); + + Console.WriteLine( "Item 10 = {0}", list[10] ); + } + catch( ArgumentOutOfRangeException ) { + Console.WriteLine( "Do some useful work and" + + " then rethrow" ); + + // Rethrow caught exception. + throw; + } + finally { + Console.WriteLine( "Cleaning up..." ); + } + } + catch { + Console.WriteLine( "Done" ); + } + } +} diff --git a/7_exception_safety/7_exception_syntax_2a.cs b/7_exception_safety/7_exception_syntax_2a.cs new file mode 100644 index 0000000..f5fed7c --- /dev/null +++ b/7_exception_safety/7_exception_syntax_2a.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; + +public class MyException : Exception +{ + public MyException( String reason, Exception inner ) + :base( reason, inner ) { + } +} + +public class Entrypoint +{ + static void Main() { + try { + try { + ArrayList list = new ArrayList(); + list.Add( 1 ); + + Console.WriteLine( "Item 10 = {0}", list[10] ); + } + catch( ArgumentOutOfRangeException x ) { + Console.WriteLine( "Do some useful work" + + " and then rethrow" ); + throw new MyException( "I'd rather throw this", + x ) ; + } + finally { + Console.WriteLine( "Cleaning up..." ); + } + } + catch( Exception x ) { + Console.WriteLine( x ); + Console.WriteLine( "Done" ); + } + } +} diff --git a/7_exception_safety/7_exception_syntax_3.cs b/7_exception_safety/7_exception_syntax_3.cs new file mode 100644 index 0000000..b5b2cf8 --- /dev/null +++ b/7_exception_safety/7_exception_syntax_3.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections; + +public class Entrypoint +{ + static void Main() { + try { + try { + ArrayList list = new ArrayList(); + list.Add( 1 ); + + Console.WriteLine( "Item 10 = {0}", list[10] ); + } + finally { + Console.WriteLine( "Cleaning up..." ); + throw new Exception( "I like to throw" ); + } + } + catch( ArgumentOutOfRangeException ) { + Console.WriteLine( "Oops! Argument out of range!" ); + } + catch { + Console.WriteLine( "Done" ); + } + } +} diff --git a/7_exception_safety/7_exception_syntax_4.cs b/7_exception_safety/7_exception_syntax_4.cs new file mode 100644 index 0000000..a750315 --- /dev/null +++ b/7_exception_safety/7_exception_syntax_4.cs @@ -0,0 +1,29 @@ +using System; + +public class Person +{ + ~Person() { + Console.WriteLine( "Cleaning up Person..." ); + Console.WriteLine( "Done Cleaning up Person..." ); + } +} + +public class Employee : Person +{ + ~Employee() { + Console.WriteLine( "Cleaning up Employee..." ); + object obj = null; + + // The following will throw an exception. + Console.WriteLine( obj.ToString() ); + Console.WriteLine( "Done cleaning up Employee..." ); + } +} + +public class Entrypoint +{ + static void Main() { + Employee emp = new Employee(); + emp = null; + } +} diff --git a/7_exception_safety/7_exception_syntax_5.cs b/7_exception_safety/7_exception_syntax_5.cs new file mode 100644 index 0000000..823c629 --- /dev/null +++ b/7_exception_safety/7_exception_syntax_5.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; + +class EventLogger +{ + static EventLogger() { + eventLog = File.CreateText( "logfile.txt" ); + + // Statement below will throw an exception. + strLogName = (string) strLogName.Clone(); + } + + static public void WriteLog( string someText ) { + eventLog.Write( someText ); + } + + static private StreamWriter eventLog; + static private string strLogName; +} + +public class EntryPoint +{ + static void Main() { + EventLogger.WriteLog( "Log this!" ); + } +} diff --git a/7_exception_safety/7_rollback_1.cs b/7_exception_safety/7_rollback_1.cs new file mode 100644 index 0000000..e19b28d --- /dev/null +++ b/7_exception_safety/7_rollback_1.cs @@ -0,0 +1,82 @@ +using System; +using System.Diagnostics; + +public class Database +{ + public void Commit() { + Console.WriteLine( "Changes Committed" ); + } + + public void Rollback() { + Console.WriteLine( "Changes Abandoned" ); + } +} + +public class RollbackHelper : IDisposable +{ + public RollbackHelper( Database db ) { + this.db = db; + } + + ~RollbackHelper() { + Dispose( false ); + } + + public void Dispose() { + Dispose( true ); + } + + public void Commit() { + db.Commit(); + committed = true; + } + + private void Dispose( bool disposing ) { + // Don't do anything if already disposed. Remember, it is + // valid to call Dispose() multiple times on a disposable + // object. + if( !disposed ) { + // Remember, we don't want to do anything to the db if + // we got here from the finalizer because the database + // field could already be finalized! However, we do + // want to free any unmanaged resources. But, in this + // case, there are none. + if( disposing ) { + if( !committed ) { + db.Rollback(); + } + } else { + Debug.Assert( false, "Failed to call Dispose()" + + " on RollbackHelper" ); + } + } + } + + private Database db; + private bool disposed = false; + private bool committed = false; +} + +public class EntryPoint +{ + static private void DoSomeWork() { + using( RollbackHelper guard = new RollbackHelper(db) ) { + // Here we do some work that could throw an exception. + + // Comment out the following line to cause an + // exception. nullPtr.GetType(); + + // If we get here, we commit. + guard.Commit(); + } + + } + + static void Main() { + db = new Database(); + DoSomeWork(); + } + + static private Database db; + static private Object nullPtr = null; +} diff --git a/7_exception_safety/7_safe_handle_1.cs b/7_exception_safety/7_safe_handle_1.cs new file mode 100644 index 0000000..1bb9b37 --- /dev/null +++ b/7_exception_safety/7_safe_handle_1.cs @@ -0,0 +1,108 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.ConstrainedExecution; +using System.Security; +using System.Security.Permissions; +using System.Text; +using Microsoft.Win32.SafeHandles; + + +// +// Matches Win32 BLUETOOTH_FIND_RADIO_PARAMS +// +[StructLayout( LayoutKind.Sequential )] +class BluetoothFindRadioParams +{ + public BluetoothFindRadioParams() { + dwSize = 4; + } + public UInt32 dwSize; +} + +// +// Matches Win32 BLUETOOTH_RADIO_INFO +// +[StructLayout( LayoutKind.Sequential, + CharSet = CharSet.Unicode )] +struct BluetoothRadioInfo +{ + public const int BLUETOOTH_MAX_NAME_SIZE = 248; + + public UInt32 dwSize; + public UInt64 address; + [MarshalAs( UnmanagedType.ByValTStr, + SizeConst = BLUETOOTH_MAX_NAME_SIZE )] + public string szName; + public UInt32 ulClassOfDevice; + public UInt16 lmpSubversion; + public UInt16 manufacturer; +} + +// +// Safe Bluetooth Enumeration Handle +// +[SecurityPermission( SecurityAction.Demand, + UnmanagedCode = true )] +sealed public class SafeBluetoothRadioFindHandle + : SafeHandleZeroOrMinusOneIsInvalid +{ + private SafeBluetoothRadioFindHandle() : base( true ) { } + + override protected bool ReleaseHandle() { + return BluetoothFindRadioClose( handle ); + } + + [DllImport( "Irprops.cpl" )] + [ReliabilityContract( Consistency.WillNotCorruptState, + Cer.Success )] + [SuppressUnmanagedCodeSecurity] + private static extern bool BluetoothFindRadioClose( + IntPtr hFind ); +} + +public class EntryPoint +{ + private const int ERROR_SUCCESS = 0; + + static void Main() { + SafeFileHandle radioHandle; + using( SafeBluetoothRadioFindHandle radioFindHandle + = BluetoothFindFirstRadio(new BluetoothFindRadioParams(), + out radioHandle) ) { + if( !radioFindHandle.IsInvalid ) { + BluetoothRadioInfo radioInfo = new BluetoothRadioInfo(); + radioInfo.dwSize = 520; + UInt32 result = BluetoothGetRadioInfo( radioHandle, + ref radioInfo ); + + if( result == ERROR_SUCCESS ) { + // Let's send the contents of the radio info to the + // console. + Console.WriteLine( "address = {0:X}", + radioInfo.address ); + Console.WriteLine( "szName = {0}", + radioInfo.szName ); + Console.WriteLine( "ulClassOfDevice = {0}", + radioInfo.ulClassOfDevice ); + Console.WriteLine( "lmpSubversion = {0}", + radioInfo.lmpSubversion ); + Console.WriteLine( "manufacturer = {0}", + radioInfo.manufacturer ); + } + + radioHandle.Dispose(); + } + } + } + + [DllImport( "Irprops.cpl" )] + private static extern SafeBluetoothRadioFindHandle + BluetoothFindFirstRadio( [MarshalAs(UnmanagedType.LPStruct)] + BluetoothFindRadioParams pbtfrp, + out SafeFileHandle phRadio ); + + [DllImport( "Irprops.cpl" )] + private static extern UInt32 + BluetoothGetRadioInfo( SafeFileHandle hRadio, + ref BluetoothRadioInfo pRadioInfo ); +} diff --git a/7_exception_safety/7_using_1.cs b/7_exception_safety/7_using_1.cs new file mode 100644 index 0000000..9622da7 --- /dev/null +++ b/7_exception_safety/7_using_1.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; +using System.Text; + +public class EntryPoint +{ + public static void DoSomeStuff() { + // Open a file. + FileStream fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ); + Byte[] msg = new UTF8Encoding(true).GetBytes("Doing Some"+ + " Stuff"); + fs.Write( msg, 0, msg.Length ); + } + + public static void DoSomeMoreStuff() { + // Open a file. + FileStream fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ); + Byte[] msg = new UTF8Encoding(true).GetBytes("Doing Some"+ + " More Stuff"); + fs.Write( msg, 0, msg.Length ); + } + + static void Main() { + DoSomeStuff(); + + DoSomeMoreStuff(); + } +} diff --git a/7_exception_safety/7_using_2.cs b/7_exception_safety/7_using_2.cs new file mode 100644 index 0000000..e47cc03 --- /dev/null +++ b/7_exception_safety/7_using_2.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using System.Text; + +public class EntryPoint +{ + public static void DoSomeStuff() { + // Open a file. + FileStream fs = null; + try { + fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ); + Byte[] msg = + new UTF8Encoding(true).GetBytes("Doing Some"+ + " Stuff\n"); + fs.Write( msg, 0, msg.Length ); + } + finally { + if( fs != null ) { + fs.Close(); + } + } + } + + public static void DoSomeMoreStuff() { + // Open a file. + FileStream fs = null; + try { + fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ); + Byte[] msg = + new UTF8Encoding(true).GetBytes("Doing Some"+ + " More Stuff\n"); + fs.Write( msg, 0, msg.Length ); + } + finally { + if( fs != null ) { + fs.Close(); + } + } + } + + static void Main() { + DoSomeStuff(); + + DoSomeMoreStuff(); + } +} diff --git a/7_exception_safety/7_using_3.cs b/7_exception_safety/7_using_3.cs new file mode 100644 index 0000000..336ffde --- /dev/null +++ b/7_exception_safety/7_using_3.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using System.Text; + +public class EntryPoint +{ + public static void DoSomeStuff() { + // Open a file. + using( FileStream fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ) ) { + Byte[] msg = + new UTF8Encoding(true).GetBytes("Doing Some" + + " Stuff\n"); + fs.Write( msg, 0, msg.Length ); + } + } + + public static void DoSomeMoreStuff() { + // Open a file. + using( FileStream fs = File.Open( "log.txt", + FileMode.Append, + FileAccess.Write, + FileShare.None ) ) { + Byte[] msg = + new UTF8Encoding(true).GetBytes("Doing Some" + + " More Stuff\n"); + fs.Write( msg, 0, msg.Length ); + } + } + + static void Main() { + DoSomeStuff(); + + DoSomeMoreStuff(); + } +} diff --git a/8_strings/8_carib_1.cs b/8_strings/8_carib_1.cs new file mode 100644 index 0000000..32e75a6 --- /dev/null +++ b/8_strings/8_carib_1.cs @@ -0,0 +1,24 @@ +using System; +using System.Globalization; + +public class EntryPoint +{ + static void Main() { + CultureAndRegionInfoBuilder cib = null; + cib = new CultureAndRegionInfoBuilder( + "x-en-US-metric", + CultureAndRegionModifiers.None ); + + cib.LoadDataFromCultureInfo( new CultureInfo("en-US") ); + cib.LoadDataFromRegionInfo( new RegionInfo("US") ); + + // Make the change. + cib.IsMetric = true; + + // Create an LDML file. + cib.Save( "x-en-US-metric.ldml" ); + + // Register with the system. + cib.Register(); + } +} diff --git a/8_strings/8_carib_2.cs b/8_strings/8_carib_2.cs new file mode 100644 index 0000000..5609ded --- /dev/null +++ b/8_strings/8_carib_2.cs @@ -0,0 +1,10 @@ +using System; +using System.Globalization; + +public class EntryPoint +{ + static void Main() { + RegionInfo ri = new RegionInfo("x-en-US-metric"); + Console.WriteLine( ri.IsMetric ); + } +} diff --git a/8_strings/8_complex_1.cs b/8_strings/8_complex_1.cs new file mode 100644 index 0000000..4319e6f --- /dev/null +++ b/8_strings/8_complex_1.cs @@ -0,0 +1,54 @@ +using System; +using System.Text; +using System.Globalization; + +public struct Complex : IFormattable +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + // IFormattable implementation + public string ToString( string format, + IFormatProvider formatProvider ) { + StringBuilder sb = new StringBuilder(); + + if( format == "DBG" ) { + // Generate debugging output for this object. + sb.Append( this.GetType().ToString() + "\n" ); + sb.AppendFormat( "\treal:\t{0}\n", real ); + sb.AppendFormat( "\timaginary:\t{0}\n", imaginary ); + } else { + sb.Append( "( " ); + sb.Append( real.ToString(format, formatProvider) ); + sb.Append( " : " ); + sb.Append( imaginary.ToString(format, formatProvider) ); + sb.Append( " )" ); + } + + return sb.ToString(); + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + CultureInfo local = CultureInfo.CurrentCulture; + CultureInfo germany = new CultureInfo( "de-DE" ); + + Complex cpx = new Complex( 12.3456, 1234.56 ); + + string strCpx = cpx.ToString( "F", local ); + Console.WriteLine( strCpx ); + + strCpx = cpx.ToString( "F", germany ); + Console.WriteLine( strCpx ); + + Console.WriteLine( "\nDebugging output:\n{0:DBG}", + cpx ); + } +} diff --git a/8_strings/8_complex_2.cs b/8_strings/8_complex_2.cs new file mode 100644 index 0000000..52e189d --- /dev/null +++ b/8_strings/8_complex_2.cs @@ -0,0 +1,96 @@ +using System; +using System.Text; +using System.Globalization; + +public class ComplexDbgFormatter : ICustomFormatter, IFormatProvider +{ + // IFormatProvider implementation + public object GetFormat( Type formatType ) { + if( formatType == typeof(ICustomFormatter) ) { + return this; + } else { + return CultureInfo.CurrentCulture. + GetFormat( formatType ); + } + } + + // ICustomFormatter implementation + public string Format( string format, + object arg, + IFormatProvider formatProvider ) { + if( arg.GetType() == typeof(Complex) && + format == "DBG" ) { + Complex cpx = (Complex) arg; + + // Generate debugging output for this object. + StringBuilder sb = new StringBuilder(); + sb.Append( arg.GetType().ToString() + "\n" ); + sb.AppendFormat( "\treal:\t{0}\n", cpx.Real ); + sb.AppendFormat( "\timaginary:\t{0}\n", cpx.Img ); + return sb.ToString(); + } else { + IFormattable formatable = arg as IFormattable; + if( formatable != null ) { + return formatable.ToString( format, formatProvider ); + } else { + return arg.ToString(); + } + } + } +} + +public struct Complex : IFormattable +{ + public Complex( double real, double imaginary ) { + this.real = real; + this.imaginary = imaginary; + } + + public double Real { + get { return real; } + } + + public double Img { + get { return imaginary; } + } + + // IFormattable implementation + public string ToString( string format, + IFormatProvider formatProvider ) { + StringBuilder sb = new StringBuilder(); + sb.Append( "( " ); + sb.Append( real.ToString(format, formatProvider) ); + sb.Append( " : " ); + sb.Append( imaginary.ToString(format, formatProvider) ); + sb.Append( " )" ); + + return sb.ToString(); + } + + private double real; + private double imaginary; +} + +public class EntryPoint +{ + static void Main() { + CultureInfo local = CultureInfo.CurrentCulture; + CultureInfo germany = new CultureInfo( "de-DE" ); + + Complex cpx = new Complex( 12.3456, 1234.56 ); + + string strCpx = cpx.ToString( "F", local ); + Console.WriteLine( strCpx ); + + strCpx = cpx.ToString( "F", germany ); + Console.WriteLine( strCpx ); + + ComplexDbgFormatter dbgFormatter = + new ComplexDbgFormatter(); + strCpx = String.Format( dbgFormatter, + "{0:DBG}", + cpx ); + Console.WriteLine( "\nDebugging output:\n{0}", + strCpx ); + } +} diff --git a/8_strings/8_encoding_1.cs b/8_strings/8_encoding_1.cs new file mode 100644 index 0000000000000000000000000000000000000000..d58302ae99a9466c7427396ac2707f6d1b7d5885 GIT binary patch literal 3068 zcmeHJO-sW-5PgT91phNu`cDwi`zanww8VHHn_rI>a!KSaZ@d24SoS%8%vnKLM}u$EYqD!2V~Yb_Q4{H^PsLNb>05fZxkmx@K*qZ!U0E$bakW zyL5xZ$a5Irkn0nqmh}QFTgS#166H|GX%u-LQ{QEo?y+A&JQGPoEcHU9&8e={*s~b( z8O$$szCtN`)%e%0O4t2n))non8UBt}j|x}5$82xL>`?I$;G8`=GP~}GW5_w_S05*4 zen<;ZbkSX_TpN5JV;K`%(%MI}u)9?$6^Yx|RZ$40gqL8onxY!zIV$C4_WTBMr7XCy zv)QzG+KlL3)IH*wn7V2EOPF}!bGfygB*oe|AiELQcd7ZehELTL(PhstS)^Xs9xp$o zG#|klV3#N6BV&ckK`JNy8@YL(vr;*~6!WA|kE+(m?FfslLmsmH*|S$!lha;v(Xnbg qduIJqN6fS8c{Tp8dey4ie-PDo`aJ8Z%KulZS!KuSF11==e?I{S{+oaR literal 0 HcmV?d00001 diff --git a/8_strings/8_formatting_1.cs b/8_strings/8_formatting_1.cs new file mode 100644 index 0000000..a3fb4b3 --- /dev/null +++ b/8_strings/8_formatting_1.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows.Forms; + +public class EntryPoint +{ + static void Main() { + CultureInfo current = CultureInfo.CurrentCulture; + CultureInfo germany = new CultureInfo( "de-DE" ); + CultureInfo russian = new CultureInfo( "ru-RU" ); + + double money = 123.45; + + string localMoney = money.ToString( "C", current ); + MessageBox.Show( localMoney, "Local Money" ); + + localMoney = money.ToString( "C", germany ); + MessageBox.Show( localMoney, "German Money" ); + + localMoney = money.ToString( "C", russian ); + MessageBox.Show( localMoney, "Russian Money" ); + } +} diff --git a/8_strings/8_formatting_2.cs b/8_strings/8_formatting_2.cs new file mode 100644 index 0000000..bb20143 --- /dev/null +++ b/8_strings/8_formatting_2.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using System.Windows.Forms; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 3 ) { + Console.WriteLine( "Please provide 3 parameters" ); + return; + } + + string composite = + String.Format( "{0} + {1} = {2}", + args[0], + args[1], + args[2] ); + + Console.WriteLine( composite ); + } +} diff --git a/8_strings/8_regex_1.cs b/8_strings/8_regex_1.cs new file mode 100644 index 0000000..42fb1d8 --- /dev/null +++ b/8_strings/8_regex_1.cs @@ -0,0 +1,26 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + + match = match.NextMatch(); + } + + } +} diff --git a/8_strings/8_regex_2.cs b/8_strings/8_regex_2.cs new file mode 100644 index 0000000..875d773 --- /dev/null +++ b/8_strings/8_regex_2.cs @@ -0,0 +1,29 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + + match = match.NextMatch(); + } + + } +} diff --git a/8_strings/8_regex_3.cs b/8_strings/8_regex_3.cs new file mode 100644 index 0000000..e99f526 --- /dev/null +++ b/8_strings/8_regex_3.cs @@ -0,0 +1,35 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + Console.WriteLine( "Groups are:" ); + foreach( Group g in match.Groups ) { + Console.WriteLine( "\t{0} at {1}", + g.Value, + g.Index ); + } + + match = match.NextMatch(); + } + + } +} diff --git a/8_strings/8_regex_4.cs b/8_strings/8_regex_4.cs new file mode 100644 index 0000000..e9f48c7 --- /dev/null +++ b/8_strings/8_regex_4.cs @@ -0,0 +1,38 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + Console.WriteLine( "Groups are:" ); + Console.WriteLine( "\tPart 1: {0}", + match.Groups["part1"] ); + Console.WriteLine( "\tPart 2: {0}", + match.Groups["part2"] ); + Console.WriteLine( "\tPart 3: {0}", + match.Groups["part3"] ); + Console.WriteLine( "\tPart 4: {0}", + match.Groups["part4"] ); + + match = match.NextMatch(); + } + + } +} diff --git a/8_strings/8_regex_5.cs b/8_strings/8_regex_5.cs new file mode 100644 index 0000000..8c162ca --- /dev/null +++ b/8_strings/8_regex_5.cs @@ -0,0 +1,28 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"\k\." + + @"\k\." + + @"\k"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + + match = match.NextMatch(); + } + } +} diff --git a/8_strings/8_regex_6.cs b/8_strings/8_regex_6.cs new file mode 100644 index 0000000..820f7ef --- /dev/null +++ b/8_strings/8_regex_6.cs @@ -0,0 +1,22 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"([01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Console.WriteLine( "Input given --> {0}", + regex.Replace(args[0], + "xxx.xxx.xxx.xxx") ); + } +} diff --git a/8_strings/8_regex_7.cs b/8_strings/8_regex_7.cs new file mode 100644 index 0000000..dbaaa5f --- /dev/null +++ b/8_strings/8_regex_7.cs @@ -0,0 +1,35 @@ +using System; +using System.Text; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + + MatchEvaluator eval = new MatchEvaluator( + EntryPoint.IPReverse ); + Console.WriteLine( regex.Replace(args[0], + eval) ); + } + + static string IPReverse( Match match ) { + StringBuilder sb = new StringBuilder(); + sb.Append( match.Groups["part4"] + "." ); + sb.Append( match.Groups["part3"] + "." ); + sb.Append( match.Groups["part2"] + "." ); + sb.Append( match.Groups["part1"] ); + return sb.ToString(); + } +} diff --git a/8_strings/8_regex_7a.cs b/8_strings/8_regex_7a.cs new file mode 100644 index 0000000..5c31aa7 --- /dev/null +++ b/8_strings/8_regex_7a.cs @@ -0,0 +1,26 @@ +using System; +using System.Text; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])\." + + @"(?[01]?\d\d?|2[0-4]\d|25[0-5])"; + Regex regex = new Regex( pattern ); + Match match = regex.Match( args[0] ); + + string replace = @"${part4}.${part3}.${part2}.${part1}" + + @" (the reverse of $&)"; + Console.WriteLine( regex.Replace(args[0], + replace) ); + } +} diff --git a/8_strings/8_regex_8.cs b/8_strings/8_regex_8.cs new file mode 100644 index 0000000..d532cfa --- /dev/null +++ b/8_strings/8_regex_8.cs @@ -0,0 +1,48 @@ +using System; +using System.Text.RegularExpressions; + +public class EntryPoint +{ + static void Main( string[] args ) { + if( args.Length < 1 ) { + Console.WriteLine( "You must provide a string." ); + return; + } + + // Create regex to search for IP address pattern. + string pattern = @" +# First part match +([01]?\d\d? # At least one digit, + # possibly prepended by 0 or 1 + # and possibly followed by another digit +# OR + |2[0-4]\d # Starts with a 2, after a number from 0-4 + # and then any digit +# OR + |25[0-5]) # 25 followed by a number from 0-5 + +\. # The whole group is followed by a period. + +# REPEAT +([01]?\d\d?|2[0-4]\d|25[0-5])\. + +# REPEAT +([01]?\d\d?|2[0-4]\d|25[0-5])\. + +# REPEAT +([01]?\d\d?|2[0-4]\d|25[0-5]) +"; + Regex regex = new Regex( pattern, + RegexOptions.IgnorePatternWhitespace ); + Match match = regex.Match( args[0] ); + while( match.Success ) { + Console.WriteLine( "IP Address found at {0} with " + + "value of {1}", + match.Index, + match.Value ); + + match = match.NextMatch(); + } + + } +} diff --git a/8_strings/8_string_literals_1.cs b/8_strings/8_string_literals_1.cs new file mode 100644 index 0000000..daa81ad --- /dev/null +++ b/8_strings/8_string_literals_1.cs @@ -0,0 +1,28 @@ +using System; + +public class EntryPoint +{ + static void Main( string[] args ) { + string lit1 = "c:\\windows\\system32"; + string lit2 = @"c:\windows\system32"; + + string lit3 = @" +Jack and Jill +Went up the hill... +"; + Console.WriteLine( lit3 ); + + Console.WriteLine( "Object.RefEq(lit1, lit2): {0}", + Object.ReferenceEquals(lit1, lit2) ); + + if( args.Length > 0 ) { + Console.WriteLine( "Parameter given: {0}", + args[0] ); + + string strNew = String.Intern( args[0] ); + + Console.WriteLine( "Object.RefEq(lit1, strNew): {0}", + Object.ReferenceEquals(lit1, strNew) ); + } + } +} diff --git a/8_strings/8_stringbuilder_1.cs b/8_strings/8_stringbuilder_1.cs new file mode 100644 index 0000000..304c11c --- /dev/null +++ b/8_strings/8_stringbuilder_1.cs @@ -0,0 +1,21 @@ +using System; +using System.Text; + +public class EntryPoint +{ + static void Main() { + StringBuilder sb = new StringBuilder(); + + sb.Append("StringBuilder ").Append("is ") + .Append("very... "); + + string built1 = sb.ToString(); + + sb.Append("cool"); + + string built2 = sb.ToString(); + + Console.WriteLine( built1 ); + Console.WriteLine( built2 ); + } +} diff --git a/8_strings/x-en-US-metric.ldml b/8_strings/x-en-US-metric.ldml new file mode 100644 index 0000000..0469c1e --- /dev/null +++ b/8_strings/x-en-US-metric.ldml @@ -0,0 +1,369 @@ + + + + ldml version 1.1 + + + + + 244 + 1 + + + eng + en + + + + USA + US + USA + + + + + + + + + + + + + + + + 1033 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 279 + 216 + + + + + + + + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + + January + February + March + April + May + June + July + August + September + October + November + December + + + + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec + + + + + + + + Sunday + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + + + Sun + Mon + Tue + Wed + Thu + Fri + Sat + + + Su + Mo + Tu + We + Th + Fr + Sa + + + + + + + + + + AM + PM + + + + + + dddd, MMMM dd, yyyy + + + MMMM dd, yyyy + + + dddd, dd MMMM, yyyy + + + dd MMMM, yyyy + + + + + + M/d/yyyy + + + M/d/yy + + + MM/dd/yy + + + MM/dd/yyyy + + + yy/MM/dd + + + yyyy-MM-dd + + + dd-MMM-yy + + + + + + MMMM, yyyy + + + + MMMM dd + + + + + + + + + h:mm:ss tt + + + hh:mm:ss tt + + + H:mm:ss + + + HH:mm:ss + + + + + + h:mm tt + + + hh:mm tt + + + H:mm + + + HH:mm + + + + + + HH:mm:ss + + + + + + + + + + + , + . + , + % + Infinity + -Infinity + NaN + + + - + + . + , + + + + 2 + + + + + + + + 3 + 3 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + + + + $ + US Dollar + + USD + US Dollar + + + + + \ No newline at end of file diff --git a/9781590598733.jpg b/9781590598733.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0e16bcde33eadd43f38743ce5e04fa64a3894c0 GIT binary patch literal 9549 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 literal 0 HcmV?d00001 diff --git a/9_arrays_collections/9_array_1.cs b/9_arrays_collections/9_array_1.cs new file mode 100644 index 0000000..70c99f7 --- /dev/null +++ b/9_arrays_collections/9_array_1.cs @@ -0,0 +1,15 @@ +using System; + +public class EntryPoint +{ + static void Main() { + int[] array1 = new int[ 10 ]; + for( int i = 0; i < array1.Length; ++i ) { + array1[i] = i*2; + } + + int[] array2 = new int[] { 2, 4, 6, 8 }; + + int[] array3 = { 1, 3, 5, 7 }; + } +} diff --git a/9_arrays_collections/9_array_2.cs b/9_arrays_collections/9_array_2.cs new file mode 100644 index 0000000..29f4eae --- /dev/null +++ b/9_arrays_collections/9_array_2.cs @@ -0,0 +1,16 @@ +using System; + +public class Animal { } +public class Dog : Animal { } +public class Cat : Animal { } + +public class EntryPoint +{ + static void Main() { + Dog[] dogs = new Dog[ 3 ]; + Cat[] cats = new Cat[ 2 ]; + + Animal[] animals = dogs; + Animal[] moreAnimals = cats; + } +} diff --git a/9_arrays_collections/9_bidirectional_iterator_1.cs b/9_arrays_collections/9_bidirectional_iterator_1.cs new file mode 100644 index 0000000..fc7c427 --- /dev/null +++ b/9_arrays_collections/9_bidirectional_iterator_1.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + LinkedList intList = new LinkedList(); + for( int i = 1; i < 6; ++i ) { + intList.AddLast( i ); + } + + BidirectionalIterator iter = + new BidirectionalIterator(intList, + intList.First, + TIteratorDirection.Forward); + + foreach( int n in iter ) { + Console.WriteLine( n ); + + if( n == 5 ) { + iter.Direction = TIteratorDirection.Backward; + } + } + } +} + +public enum TIteratorDirection { + Forward, + Backward +}; + +public class BidirectionalIterator : IEnumerable +{ + public BidirectionalIterator( LinkedList list, + LinkedListNode start, + TIteratorDirection dir ) { + enumerator = CreateEnumerator( list, + start, + dir ).GetEnumerator(); + enumType = enumerator.GetType(); + } + + public TIteratorDirection Direction { + get { + return (TIteratorDirection) enumType.GetField("dir").GetValue( enumerator ); + } + set { + enumType.GetField("dir").SetValue( enumerator, + value ); + } + } + + private IEnumerator enumerator; + private Type enumType; + + private IEnumerable CreateEnumerator( LinkedList list, + LinkedListNode start, + TIteratorDirection dir ) { + LinkedListNode current = null; + do { + if( current == null ) { + current = start; + } else { + if( dir == TIteratorDirection.Forward ) { + current = current.Next; + } else { + current = current.Previous; + } + } + + if( current != null ) { + yield return current.Value; + } + } while( current != null ); + } + + public IEnumerator GetEnumerator() { + return enumerator; + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } +} + diff --git a/9_arrays_collections/9_circular_iterator_1.cs b/9_arrays_collections/9_circular_iterator_1.cs new file mode 100644 index 0000000..c01c47b --- /dev/null +++ b/9_arrays_collections/9_circular_iterator_1.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + LinkedList intList = new LinkedList(); + for( int i = 1; i < 6; ++i ) { + intList.AddLast( i ); + } + + CircularIterator iter = + new CircularIterator(intList, + intList.First); + + int counter = 0; + foreach( int n in iter ) { + Console.WriteLine( n ); + + if( counter++ == 100 ) { + iter.Stop(); + } + } + } +} + +public class CircularIterator : IEnumerable +{ + public CircularIterator( LinkedList list, + LinkedListNode start ) { + enumerator = CreateEnumerator( list, + start, + false ).GetEnumerator(); + enumType = enumerator.GetType(); + } + + public void Stop() { + enumType.GetField("stop").SetValue( enumerator, true ); + } + + private IEnumerator enumerator; + private Type enumType; + + private IEnumerable CreateEnumerator( LinkedList list, + LinkedListNode start, + bool stop ) { + LinkedListNode current = null; + do { + if( current == null ) { + current = start; + } else { + current = current.Next; + if( current == null ) { + current = start; + } + } + + yield return current.Value; + } while( !stop ); + } + + public IEnumerator GetEnumerator() { + return enumerator; + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } +} + diff --git a/9_arrays_collections/9_enumerable_1.cs b/9_arrays_collections/9_enumerable_1.cs new file mode 100644 index 0000000..a6dbf93 --- /dev/null +++ b/9_arrays_collections/9_enumerable_1.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +public class EntryPoint +{ + static public IEnumerable Powers( int from, + int to ) { + for( int i = from; i <= to; ++i ) { + yield return (int) Math.Pow( 2, i ); + } + } + + static void Main() { + IEnumerable powers = Powers( 0, 16 ); + foreach( int result in powers ) { + Console.WriteLine( result ); + } + } +} diff --git a/9_arrays_collections/9_jagged_1.cs b/9_arrays_collections/9_jagged_1.cs new file mode 100644 index 0000000..afb4904 --- /dev/null +++ b/9_arrays_collections/9_jagged_1.cs @@ -0,0 +1,30 @@ +using System; +using System.Text; + +public class EntryPoint +{ + static void Main() { + int[][] jagged = new int[3][]; + + jagged[0] = new int[] { 1, 2}; + jagged[1] = new int[] {1, 2, 3, 4, 5}; + jagged[2] = new int[] {6, 5, 4}; + + foreach( int[] ar in jagged ) { + StringBuilder sb = new StringBuilder(); + foreach( int n in ar ) { + sb.AppendFormat( "{0} ", n ); + } + Console.WriteLine( sb.ToString() ); + } + Console.WriteLine(); + + for( int i = 0; i < jagged.Length; ++i ) { + StringBuilder sb = new StringBuilder(); + for( int j = 0; j < jagged[i].Length; ++j ) { + sb.AppendFormat( "{0} ", jagged[i][j] ); + } + Console.WriteLine( sb.ToString() ); + } + } +} diff --git a/9_arrays_collections/9_multidim_1.cs b/9_arrays_collections/9_multidim_1.cs new file mode 100644 index 0000000..70e52a3 --- /dev/null +++ b/9_arrays_collections/9_multidim_1.cs @@ -0,0 +1,16 @@ +using System; + +public class EntryPoint +{ + static void Main() { + int[,] twoDim1 = new int[5,3]; + + int[,] twoDim2 = { {1, 2, 3}, + {4, 5, 6}, + {7, 8, 9} }; + + foreach( int i in twoDim2 ) { + Console.WriteLine( i ); + } + } +} diff --git a/9_arrays_collections/9_multidim_2.cs b/9_arrays_collections/9_multidim_2.cs new file mode 100644 index 0000000..fac3fec --- /dev/null +++ b/9_arrays_collections/9_multidim_2.cs @@ -0,0 +1,26 @@ +using System; + +public class EntryPoint +{ + static void Main() { + int[,] twoDim = { {1, 2, 3}, + {4, 5, 6}, + {7, 8, 9} }; + + for( int i = 0; i != twoDim.GetLength(0); ++i ) { + for( int j = 0; j != twoDim.GetLength(1); ++j ) { + Console.WriteLine( twoDim[i,j] ); + } + } + + for( int i = twoDim.GetLowerBound(0); + i <= twoDim.GetUpperBound(0); + ++i ) { + for( int j = twoDim.GetLowerBound(1); + j <= twoDim.GetUpperBound(1); + ++j ) { + Console.WriteLine( twoDim[i,j] ); + } + } + } +} diff --git a/9_arrays_collections/9_my_collection_1.cs b/9_arrays_collections/9_my_collection_1.cs new file mode 100644 index 0000000..2796833 --- /dev/null +++ b/9_arrays_collections/9_my_collection_1.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +public class MyCollection : Collection +{ + public MyCollection() : base() { + } + + public MyCollection( IList list ) + : base(list) { } + + public MyCollection( IEnumerable enumerable ) + : base() { + foreach( T item in enumerable ) { + this.Add( item ); + } + } + + public MyCollection( IEnumerator enumerator ) + : base() { + while( enumerator.MoveNext() ) { + this.Add( enumerator.Current ); + } + } +} + +public class EntryPoint +{ + static void Main() { + MyCollection coll = + new MyCollection( GenerateNumbers() ); + + foreach( int n in coll ) { + Console.WriteLine( n ); + } + } + + static IEnumerable GenerateNumbers() { + for( int i = 4; i >= 0; --i ) { + yield return i; + } + } +} diff --git a/9_arrays_collections/9_mycoll_1.cs b/9_arrays_collections/9_mycoll_1.cs new file mode 100644 index 0000000..a060c5e --- /dev/null +++ b/9_arrays_collections/9_mycoll_1.cs @@ -0,0 +1,79 @@ +using System; +using System.Threading; +using System.Collections; +using System.Collections.Generic; + +public class MyColl : IEnumerable +{ + public MyColl( T[] items ) { + this.items = items; + } + + public IEnumerator GetEnumerator() { + return new NestedEnumerator( this ); + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + // The enumerator definition. + class NestedEnumerator : IEnumerator + { + public NestedEnumerator( MyColl coll ) { + Monitor.Enter( coll.items.SyncRoot ); + this.index = -1; + this.coll = coll; + } + + public T Current { + get { return current; } + } + + object IEnumerator.Current { + get { return Current; } + } + + public bool MoveNext() { + if( ++index >= coll.items.Length ) { + return false; + } else { + current = coll.items[index]; + return true; + } + } + + public void Reset() { + current = default(T); + index = 0; + } + + public void Dispose() { + try { + current = default(T); + index = coll.items.Length; + } + finally { + Monitor.Exit( coll.items.SyncRoot ); + } + } + + private MyColl coll; + private T current; + private int index; + } + + private T[] items; +} + +public class EntryPoint +{ + static void Main() { + MyColl integers = + new MyColl( new int[] {1, 2, 3, 4} ); + + foreach( int n in integers ) { + Console.WriteLine( n ); + } + } +} diff --git a/9_arrays_collections/9_mycoll_2.cs b/9_arrays_collections/9_mycoll_2.cs new file mode 100644 index 0000000..2263e97 --- /dev/null +++ b/9_arrays_collections/9_mycoll_2.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class MyColl : IEnumerable +{ + public MyColl( T[] items ) { + this.items = items; + } + + public IEnumerator GetEnumerator() { + foreach( T item in items ) { + yield return item; + } + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private T[] items; +} + +public class EntryPoint +{ + static void Main() { + MyColl integers = + new MyColl( new int[] {1, 2, 3, 4} ); + + foreach( int n in integers ) { + Console.WriteLine( n ); + } + } +} diff --git a/9_arrays_collections/9_mycoll_3.cs b/9_arrays_collections/9_mycoll_3.cs new file mode 100644 index 0000000..1c6d796 --- /dev/null +++ b/9_arrays_collections/9_mycoll_3.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class MyColl : IEnumerable +{ + public MyColl( T[] items ) { + this.items = items; + } + + public IEnumerator GetEnumerator() { + lock( items.SyncRoot ) { + for( int i = 0; i < items.Length; ++i ) { + yield return items[i]; + } + } + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private T[] items; +} + +public class EntryPoint +{ + static void Main() { + MyColl integers = + new MyColl( new int[] {1, 2, 3, 4} ); + + foreach( int n in integers ) { + Console.WriteLine( n ); + } + } +} diff --git a/9_arrays_collections/9_mycoll_4.cs b/9_arrays_collections/9_mycoll_4.cs new file mode 100644 index 0000000..3d90a40 --- /dev/null +++ b/9_arrays_collections/9_mycoll_4.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading; +using System.Collections; +using System.Collections.Generic; + +public class MyColl : IEnumerable +{ + public MyColl( T[] items ) { + this.items = items; + } + + public IEnumerator GetEnumerator( bool synchronized ) { + if( synchronized ) { + Monitor.Enter( items.SyncRoot ); + } + try { + int index = 0; + while( true ) { + if( index < items.Length ) { + yield return items[index++]; + } else { + yield break; + } + } + } + finally { + if( synchronized ) { + Monitor.Exit( items.SyncRoot ); + } + } + } + + public IEnumerator GetEnumerator() { + return GetEnumerator( false ); + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private T[] items; +} + +public class EntryPoint +{ + static void Main() { + MyColl integers = + new MyColl( new int[] {1, 2, 3, 4} ); + + foreach( int n in integers ) { + Console.WriteLine( n ); + } + } +} diff --git a/9_arrays_collections/9_mycoll_5.cs b/9_arrays_collections/9_mycoll_5.cs new file mode 100644 index 0000000..89af43c --- /dev/null +++ b/9_arrays_collections/9_mycoll_5.cs @@ -0,0 +1,75 @@ +using System; +using System.Threading; +using System.Reflection; +using System.Collections; +using System.Collections.Generic; + +public struct ImmutableBool +{ + public ImmutableBool( bool b ) { + this.b = b; + } + + public bool Value { + get { return b; } + } + + private bool b; +} + +public class MyColl : IEnumerable +{ + public MyColl( T[] items ) { + this.items = items; + } + + public IEnumerator GetEnumerator( + ImmutableBool synchronized ) { + if( synchronized.Value ) { + Monitor.Enter( items.SyncRoot ); + } + try { + foreach( T item in items ) { + yield return item; + } + } + finally { + if( synchronized.Value ) { + Monitor.Exit( items.SyncRoot ); + } + } + } + + public IEnumerator GetEnumerator() { + return GetEnumerator( new ImmutableBool(false) ); + } + + IEnumerator IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + private T[] items; +} + +public class EntryPoint +{ + static void Main() { + MyColl integers = + new MyColl( new int[] {1, 2, 3, 4} ); + + IEnumerator enumerator = + integers.GetEnumerator( new ImmutableBool(true) ); + + // Get reference to synchronized field. + object field = enumerator.GetType(). + GetField("synchronized").GetValue( enumerator ); + + while( enumerator.MoveNext() ) { + Console.WriteLine( enumerator.Current ); + + // Throws an exception. + field.GetType().GetProperty("Value"). + SetValue( field, false, null ); + } + } +} diff --git a/9_arrays_collections/9_reverse_iterator_1.cs b/9_arrays_collections/9_reverse_iterator_1.cs new file mode 100644 index 0000000..e4363a6 --- /dev/null +++ b/9_arrays_collections/9_reverse_iterator_1.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; + +public class EntryPoint +{ + static void Main() { + List intList = new List(); + intList.Add( 1 ); + intList.Add( 2 ); + intList.Add( 3 ); + intList.Add( 4 ); + + foreach( int n in CreateReverseIterator(intList) ) { + Console.WriteLine( n ); + } + } + + static IEnumerable CreateReverseIterator( IList list ) { + int count = list.Count; + for( int i = count-1; i >= 0; --i ) { + yield return list[i]; + } + } +} diff --git a/9_arrays_collections/9_vector_1.cs b/9_arrays_collections/9_vector_1.cs new file mode 100644 index 0000000..79a610a --- /dev/null +++ b/9_arrays_collections/9_vector_1.cs @@ -0,0 +1,16 @@ +public class EntryPoint +{ + static void Main() { + int val = 123; + int newVal; + + int[] vector = new int[1]; + int[,] array = new int[1,1]; + + vector[0] = val; + array[0,0] = val; + + newVal = vector[0]; + newVal = array[0,0]; + } +} diff --git a/9_arrays_collections/coll_initializer_1.cs b/9_arrays_collections/coll_initializer_1.cs new file mode 100644 index 0000000..4ad2e23 --- /dev/null +++ b/9_arrays_collections/coll_initializer_1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +public class Employee +{ + public string Name { get; set; } +} + +public class CollInitializerExample +{ + static void Main() { + var developmentTeam = new List { + new Employee { Name = "Michael Bolton" }, + new Employee { Name = "Samir Nagheenanajar" }, + new Employee { Name = "Peter Gibbons" } + }; + + Console.WriteLine( "Development Team:" ); + foreach( var employee in developmentTeam ) { + Console.WriteLine( "\t" + employee.Name ); + } + } +} diff --git a/9_arrays_collections/implicitly_typed_arrays_1.cs b/9_arrays_collections/implicitly_typed_arrays_1.cs new file mode 100644 index 0000000..c54d577 --- /dev/null +++ b/9_arrays_collections/implicitly_typed_arrays_1.cs @@ -0,0 +1,21 @@ +using System; + +public class EntryPoint +{ + static void Main() { + // A conventional array + int[] conventionalArray = new int[] { 1, 2, 3 }; + + // An implicitly typed array + var implicitlyTypedArray = new [] { 4, 5, 6 }; + Console.WriteLine( implicitlyTypedArray.GetType() ); + + // An array of doubles + var someNumbers = new [] { 3.1415, 1, 6 }; + Console.WriteLine( someNumbers.GetType() ); + + // Won't compile! + // var someStrings = new [] { "int", + // someNumbers.GetType() }; + } +} diff --git a/9_arrays_collections/implicitly_typed_arrays_2.cs b/9_arrays_collections/implicitly_typed_arrays_2.cs new file mode 100644 index 0000000..deb7674 --- /dev/null +++ b/9_arrays_collections/implicitly_typed_arrays_2.cs @@ -0,0 +1,38 @@ +using System; + +public struct A +{ + public A( int i ) { + this.i = i; + } + + public static implicit operator B( A a ) { + return new B( a.i ); + } + + private int i; +} + +public struct B +{ + public B( int j ) { + this.j = j; + } + + public static implicit operator A( B b ) { + return new A( b.j ); + } + + private int j; +} + +public class EntryPoint +{ + static void Main() { + A a = new A( 42 ); + B b = a; + + // Won't compile! + // var newArray = new [] { a, b }; + } +} diff --git a/9_arrays_collections/implicitly_typed_arrays_3.cs b/9_arrays_collections/implicitly_typed_arrays_3.cs new file mode 100644 index 0000000..db61a3d --- /dev/null +++ b/9_arrays_collections/implicitly_typed_arrays_3.cs @@ -0,0 +1,18 @@ +using System; + +public class EntryPoint { + static void Main() { + var threeByThree = new [] { + new [] { 1, 2, 3 }, + new [] { 4, 5, 6 }, + new [] { 7, 8, 9 } + }; + + foreach( var i in threeByThree ) { + foreach( var j in i ) { + Console.Write( "{0}, ", j ); + } + Console.Write( "\n" ); + } + } +} diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..5add460 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Freeware License, some rights reserved + +Copyright (c) 2007 Trey Nash + +Permission is hereby granted, free of charge, to anyone obtaining a copy +of this software and associated documentation files (the "Software"), +to work with the Software within the limits of freeware distribution and fair use. +This includes the rights to use, copy, and modify the Software for personal use. +Users are also allowed and encouraged to submit corrections and modifications +to the Software for the benefit of other users. + +It is not allowed to reuse, modify, or redistribute the Software for +commercial use in any way, or for a user’s educational materials such as books +or blog articles without prior permission from the copyright holder. + +The above copyright notice and this permission notice need to be included +in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8484465 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +#Apress Source Code + +This repository accompanies [*Accelerated C# 2008*](http://www.apress.com/9781590598733) by Trey Nash (Apress, 2007). + +![Cover image](9781590598733.jpg) + +Download the files as a zip using the green button, or clone the repository to your machine using Git. + +##Releases + +Release v1.0 corresponds to the code in the published book, without corrections or updates. + +##Contributions + +See the file Contributing.md for more information on how you can contribute to this repository. diff --git a/README_FIRST.html b/README_FIRST.html new file mode 100644 index 0000000..d296719 --- /dev/null +++ b/README_FIRST.html @@ -0,0 +1,165 @@ + + + + + + + + +README + + + + + + + + +

+ +

This zip file includes virtually all of the source code in Accelerated C# 2008.  +Not every source file contains a static Main() method, therefore, those files will +not compile.  For the files that do compile, they can typically be built +by invoking the C# compiler (csc.exe) +from the command line as shown below:

+ +

 

+ +

csc +/debug+ <filename>

+ +

 

+ +

Where <filename> +is replaced with the C# file you want to compile.  Of course, /debug+ is optional, but I’m assuming +you may want to step through the code using cordbg or DbgCLR.

+ +

 

+ +

I have included a file named build.proj which is an msbuild +project file.  You can use it to build +all of the code snippets in one operation by executing the following command +from a Visual Studio 2008 command prompt:

+ +

 

+ +

msbuild +/t:Compile

+ +

 

+ +

If you examine the msbuild project file, you will +see that you can also build the code from each individual chapter if you like.

+ +

 

+ +

Have fun!

+ +
+ + + + diff --git a/build.proj b/build.proj new file mode 100644 index 0000000..b8e648a --- /dev/null +++ b/build.proj @@ -0,0 +1,240 @@ + + + + v3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..f6005ad --- /dev/null +++ b/contributing.md @@ -0,0 +1,14 @@ +# Contributing to Apress Source Code + +Copyright for Apress source code belongs to the author(s). However, under fair use you are encouraged to fork and contribute minor corrections and updates for the benefit of the author(s) and other readers. + +## How to Contribute + +1. Make sure you have a GitHub account. +2. Fork the repository for the relevant book. +3. Create a new branch on which to make your change, e.g. +`git checkout -b my_code_contribution` +4. Commit your change. Include a commit message describing the correction. Please note that if your commit message is not clear, the correction will not be accepted. +5. Submit a pull request. + +Thank you for your contribution! \ No newline at end of file diff --git a/intro_to_c_sharp/hello_world.cs b/intro_to_c_sharp/hello_world.cs new file mode 100644 index 0000000..e3e2171 --- /dev/null +++ b/intro_to_c_sharp/hello_world.cs @@ -0,0 +1,6 @@ +class EntryPoint +{ + static void Main() { + System.Console.WriteLine( "Hello World!" ); + } +} diff --git a/intro_to_c_sharp/hello_world_2.cs b/intro_to_c_sharp/hello_world_2.cs new file mode 100644 index 0000000..4da197d --- /dev/null +++ b/intro_to_c_sharp/hello_world_2.cs @@ -0,0 +1,8 @@ +using System; + +class EntryPoint +{ + static void Main() { + Console.WriteLine( "Hello World!" ); + } +}